본문 바로가기
2학년 2학기/c언어

9-7장 이중 포인터

by kkkkk1023 2024. 10. 29.

이중 포인터

: 포인터를 가르키는 포인터이다. 즉, 주소를 갖고 있는 메모리의 주소를 갖고있는 메모리를 의미한다. 

 

#include<stdio.h>

int main(){

    int a = 3;
    int* p = &a;
    int** pp = &p;

    printf("%d\n", *p); //3
    printf("%d\n", **pp); //3
    
}

 

이처럼 pp가 이중 포인터이다. a의 주소를 담고 있는 p의 주소를 담고 있는 pp이다. 

따라서, 간접 참조 연산자를 2개 써줘야하는데, **pp는 pp의 값을 접근하고, 다시 그 값은 주소이니깐 그 주소의 값을 접근하는 형태이다.

 

 

[예제]

#include<stdio.h>

int globlal_value = 30;

void call_by_value(int* val){ //매개변수가 포인터이기 때문에 변수자체가 넘어온다.
    val = &globlal_value;
}

void call_by_reference(int** ref){ //매개변수가 이중 포인터이기 때문에 변수의 주소가 넘어온다.(인자가 이중포인터가 아니어도 그냥 매개변수가 이중 포인터이기 때문에 주소가 넘겨진다.)
    *ref = &globlal_value;
}

int main(){

    int local_val = 10;
    int* value = &local_val;
    int* reference = &local_val;

    printf("before: *value=%d, *reference=%d\n", *value, *reference);
    call_by_value(value);
    call_by_reference(&reference);
    printf("after: *value=%d, *reference=%d\n", *value, *reference);
    
}

해당 예제는 함수 매개변수 타입을 이중 포인터로 선언했기 때문에 포인터 변수를 넘기면 포인터 변수 자체가 넘어가는게 아니라, 포인터 변수의 주소가 넘어가게 된다. 

 

따라서, 간접 참조 연산자를 사용했을 때 넘어온 포인터 변수가 가지고 있는 주소를 변경할 수 있게 된다 

 

 

이 사진은 대략적인 흐름이다. 흐름 파악 용으로만 참고하자.

 

 

이렇게 이중 포인터를 이용하면 포인터가 가지고 있는 주소를 변경여 참조 값 변경이 가능하고, 동적 메모리 할당을 할 수 있다.