2학년 2학기/c언어
9-7장 이중 포인터
kkkkk1023
2024. 10. 29. 20:08
이중 포인터
: 포인터를 가르키는 포인터이다. 즉, 주소를 갖고 있는 메모리의 주소를 갖고있는 메모리를 의미한다.
#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);
}
해당 예제는 함수 매개변수 타입을 이중 포인터로 선언했기 때문에 포인터 변수를 넘기면 포인터 변수 자체가 넘어가는게 아니라, 포인터 변수의 주소가 넘어가게 된다.
따라서, 간접 참조 연산자를 사용했을 때 넘어온 포인터 변수가 가지고 있는 주소를 변경할 수 있게 된다
이 사진은 대략적인 흐름이다. 흐름 파악 용으로만 참고하자.
이렇게 이중 포인터를 이용하면 포인터가 가지고 있는 주소를 변경여 참조 값 변경이 가능하고, 동적 메모리 할당을 할 수 있다.