이중 포인터란 포인터 변수를 가리키는 또 다른 포인터 변수를 뜻한다. 이중 포인터 혹은 더블 포인터라고 부르며
다음과 같이 선언한다. int **dptr; // int형 이중 포인터
만약 다음과 같은 코드가 있다고 생각해보자.
int main(void) {
double num = 3.14;
double * ptr = #
double ** ptr = &ptr;
}
<소스코드>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#include <stdio.h>
int main(void) {
double num = 3.14;
double* ptr = # // 포인터 변수 ptr로 num을 가리킴
double** dptr = &ptr; // 이중 포인터 변수 dptr로 포인터 변수 ptr을 가리킴
double* ptr2;
printf("%9p %9p \n", ptr, *dptr); // ptr과 *dptr은 같으므로 동일한 출력결과를 보인다.
printf("%9g %9g \n", num, **dptr); // **dpt과 num은 같으므로 동일한 출력결과를 보인다.
ptr2 = *dptr; // ptr2 = ptr과 같은 의미
*ptr2 = 10.99;
printf("%9g %9g \n", num, **dptr); // num과 **dptr이 같으므로 동일한 출력결과를 보인다.
return 0;
}
|
cs |
<실행결과>
위의 코드를 그림으로 표현하면 다음과 같다.
포인터 변수의 Call by reference
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
#include <stdio.h>
void SwapPtr(int **dptr1, int **dptr2) { // 1번 방법
int temp;
temp = **dptr1;
**dptr1 = **dptr2;
**dptr2 = temp;
}
void SwapPtr2(int** dptr1, int** dptr2) { // 2번 방법
int* temp;
temp = *dptr1;
*dptr1 = *dptr2;
*dptr2 = temp;
}
int main(void) {
int num1 = 5, num2 = 10;
int* ptr1 = &num1, * ptr2 = &num2;
printf("*ptr1 : %d, *ptr2 : %d \n", *ptr1, *ptr2);
SwapPtr(&ptr1, &ptr2);
printf("*ptr1 : %d, *ptr2 : %d \n", *ptr1, *ptr2);
SwapPtr2(&ptr1, &ptr2);
printf("*ptr1 : %d, *ptr2 : %d \n", *ptr1, *ptr2);
return 0;
}
|
cs |
<실행결과>
포인터 배열과 포인터 배열의 포인터 형
예제로 알아보자.
<소스코드>
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#include <stdio.h>
int main(void) {
int num1 = 5, num2 = 10, num3 = 15;
int* ptr1 = &num1, * ptr2 = &num2, * ptr3 = &num3;
int *ptrArray[3] = { ptr1, ptr2, ptr3 };
int** dptr = ptrArray;
printf("%d %d %d \n", *(ptrArray[0]), *(ptrArray[1]), *(ptrArray[2]));
printf("%d %d %d \n", *(dptr[0]), *(dptr[1]), *(dptr[2]));
return 0;
}
|
cs |
<실행결과>
7번 라인을 보면 num1, num2, num3의 주소 값이 배열로 저장된 포인터 배열 ptrArray를 확인할 수 있다.
8번 라인을 보면 이중 포인터 dptr에 ptrArray가 대입된다는 것을 알 수 있다.
'C' 카테고리의 다른 글
9. 함수 포인터 & void 포인터 (0) | 2021.06.26 |
---|---|
8. 2차원 배열과 포인터 (0) | 2021.06.26 |
6. 다차원 배열 (0) | 2021.06.25 |
5. 포인터와 함수 (0) | 2021.06.25 |
4. 포인터와 배열 (0) | 2021.06.22 |