이중 포인터
: 포인터를 가르키는 포인터이다. 즉, 주소를 갖고 있는 메모리의 주소를 갖고있는 메모리를 의미한다.
#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);
}
해당 예제는 함수 매개변수 타입을 이중 포인터로 선언했기 때문에 포인터 변수를 넘기면 포인터 변수 자체가 넘어가는게 아니라, 포인터 변수의 주소가 넘어가게 된다.
따라서, 간접 참조 연산자를 사용했을 때 넘어온 포인터 변수가 가지고 있는 주소를 변경할 수 있게 된다
이 사진은 대략적인 흐름이다. 흐름 파악 용으로만 참고하자.
이렇게 이중 포인터를 이용하면 포인터가 가지고 있는 주소를 변경여 참조 값 변경이 가능하고, 동적 메모리 할당을 할 수 있다.
'2학년 2학기 > c언어' 카테고리의 다른 글
10-2장 문자 입출력과 문자열 입출력 (0) | 2024.11.04 |
---|---|
10-1장 문자열과 NULL 문자 (1) | 2024.11.04 |
9-6장 함수 포인터 (0) | 2024.10.29 |
9-5장 함수가 포인터를 반환하는 경우 (0) | 2024.10.29 |
9-4장 배열과 포인터 (0) | 2024.10.28 |