이중 포인터란 포인터 변수를 가리키는 또 다른 포인터 변수를 뜻한다. 이중 포인터 혹은 더블 포인터라고 부르며 

다음과 같이 선언한다. int **dptr; // int형 이중 포인터 

만약 다음과 같은 코드가 있다고 생각해보자.

int main(void) {

    double num = 3.14;

    double * ptr = #

    double ** ptr = &ptr;

}

이중포인터가 포인터를 통해 num을 가르키는 모습

<소스코드>

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 = &num; // 포인터 변수 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

+ Recent posts