포도가게의 개발일지

C언어 포인터 본문

C언어

C언어 포인터

grape.store 2021. 9. 4. 23:28
반응형

1. 단순 포인터

#include<stdio.h>

int main(){

	int a = (int *)malloc(sizeof(int));
    
    ## a의 저장된 malloc의 주소를 보여줌
    printf("%p", a);
    
    ## 포인터 변수 a의 주소를 보여줌
    printf("%p", &a);
    
    ## go to malloc의 주소 만약 말록 주소위치의 0번째값에 10이 저장되있으면
    ## 10을 출력해준다.
    printf("%p", *a);
	
}

2. 함수 포인터

#include<stdio.h>

## 함수형 포인터도 똑같이 a,b라는 포인터형 변수를 생성
## *은 세가지 정의를 갖는데 포인터 선언*은 그냥 얘 포인터야
## 두번째 *은 곱하기를 의미
## 세번째 *은 역참조 dereference를 의미
## 역참조는 만약 포인터 a의 주소값이 저장되어있으면
## = 우측에 있을때는 *a를 통해 그 주소로 가서 값을 가져와를 의미한다.
## = 좌측에 있을때는 *a를 통해 그 주소로 가서 원하는 값을 넣어준다.
void swap(int* a, int* b){
    printf("a func: %p\n", a);
    printf("b func: %p\n", b);
    
    ## a의 주소로 가서 값 10을 가져옴
    int temp = *a;
    
    ## a의 주소로 가서 *b가 가져온 값을 넣어줌
    *a = *b;
    
    ## b의 주소로 가서 temp값을 넣어줌
    *b = temp;
}

int main(){
	int a = 10;
    int b = 20;
    printf("a: %d\n", a);
    printf("b: %d\n", b);
    
    ## a의 주소와 b의 주소를 넘겨줌
    swap(&a,&b);
    printf("a: %d\n", a);
    printf("b: %d\n", b);
	

}
/////////////////////////////////출력값 ////////////////////////////////
a: 10
b: 20
a func: 0x7ffee14a276c
b func: 0x7ffee14a2768
a: 20
b: 10

3. 함수 더블포인터

#include <stdio.h>
#include <stdlib.h>

typedef enum { RBTREE_RED, RBTREE_BLACK } color_t;

typedef struct node_t{
    int data;
    color_t color;
    struct node_t* parent,* left,* right;
}node_t;

## 더블 포인터로 받은 이유는 포인터의 주소를 넘겼기 때문의 주소의주소 즉 포인터의포인터가 되기때문에
## 더블포인터로 변수를 선언하여 받아야 한다.
void insert_rbtree(node_t** root, int data){
    printf("main함수인 root의주소: %p\n", root);
    printf("함수 지역변수인 root의 주소: %p\n", &root);
    printf("값 : %p\n", *root);

}

int main(){
	## 구조체자료형 포인터선언 = 주소값
    node_t *root = NULL;
    
    ## 포인터 변수 root의 주소를 넣어줌
    insert_rbtree(&root,10);

}

/////////////////////////////////////출력 값/////////////////////////////////////
main함수인 root의주소: 0x7ffee934c768
함수 지역변수인 root의 주소: 0x7ffee934c748
값 : 0x0

4. const로 선언된 포인터 값 바꾸는 법

void insert_rbtree(const rbtree* t, key_t key){
// const로 선언된 포인터는 내용 변경할 수 없다.
// 하지만 포인터 변수 t를 같은 자료형으로 복사 하게 되면 const가 깨지게 되면서
// t의 내용을 변경 할 수 있게 된다.
    rbtree *temp_t = t;
    if(temp_t->root ==NULL){
        temp_t->root = (node_t *)calloc(sizeof(node_t), 1);
    }
    // 복사하지 않은 경우 일반적인경우
    t->멤버 = 10; -> 변경할 수 없는 형식이기에 에러가 발생
    
    // 복사 후 경우
    // 이유는 찾아보는 중이다.
    t->멤버 = 10; -> const가 깨져서 내용을 변경 가능

'C언어' 카테고리의 다른 글

Typedef struct(구조체)  (0) 2021.09.03
C언어 malloc  (0) 2021.09.02
Comments