C - 이중 포인터

2022. 3. 9. 23:21C

이중 포인터란?

포인터에 대한 포인터를 의미하며, 기억장소에 저장된 데이터를 가리키는 포인터를 다시 한번 가리키는 포인터이다.

사용 형식은

데이터형 **포인터;

 

char **pt;

위와 같이 선언했을 경우 **pt는 문자형의 데이터를 나타내고 *pt는 문자형의 데이터, 한마디로 **pt가 저장되어 있는 주소값을 가진다.

pt는 문자형의 데이터를 가리키는 주소값, 즉 *pt의 주소값이 저장되어 있는 기억장소의 주소값을 가진다.

 

a=20;

p=&a;라 생각을 해보자

a는 20의 값을 가지고 있고 그 주소 값은 &a (100)이라고 가정하자.

p = 100의 값을 가지고 있고 &p (200)의 주소 값을 가지고 있다고 하면

a = 20

&a = 100

p = 100

&p = 200

*p = 20이다.

 

&p는 정수형 변수 a의 주소를 저장하고 있는 p의 주소값이라는 사실을 확실히 알고 가야한다.

 

이후 p2 = &p

p2 = 200 이고 &p2 (300)의 주소 값을 가지고 있다고 하면

*p2 = 100

**p2 = 20 이 된다.

예제를 보자

int num1 = 10;
int *ptr = &num1;
int **pptr = &ptr;

printf("pptr : %p\n\n", pptr);
printf("*pptr : %p\n", *pptr);
printf("ptr : %p\n\n", ptr);
printf("**pptr : %d\n", **pptr);
printf("num1 : %d", num1);

출력 결과

pptr : 0x30634f9f0

*pptr : 0x30634f9fc
ptr : 0x30634f9fc

**pptr : 10
num1 : 10

pptr의 메모리주소 -> ptr의 메모리주소 -> 10 으로 인한 **pptr = 10이라는 결과를 볼 수 있다.

 

예제를 통해 좀 더 이해해보면

 

int num[2][3] = { {1,2,3}, {11,12,13}};

printf("num        : %p\n",num);
printf("num[0]     : %p\n",num[0]);
printf("num[0][0]  : %p\n\n", &num[0][0]);
printf("num[1]     : %p\n", num[1]);
printf("&num[1][0] : %p\n", &num[1][0]);

출력 결과

num        : 0x30c3aa9e0
num[0]     : 0x30c3aa9e0
num[0][0]  : 0x30c3aa9e0

num[1]     : 0x30c3aa9ec
&num[1][0] : 0x30c3aa9ec

배열의 주소값과 0번째 인덱스의 주소가 같다는 사실을 확인할 수 있다.

 

2차원 배열에서의 포인터 연산

int num[2][3] = { {1,2,3}, {11,12,13}};

printf("num        : %d\n",num);
printf("num+1      : %d\n\n", num+1);

printf("num[0]     : %d\n", num[0]);
printf("num[0]+1   : %d\n", num[0]+1);

출력 결과

num        : 162048480
num+1      : 162048492

num[0]     : 162048480
num[0]+1   : 162048484

잘보면 num과 num+1에 주소값의 차이가 12인것을 볼 수 있는데,

num 배열은 한 행에 int 자료형(4byte)가 3개씩 12byte 단위로 묶여있기 때문에 주소값 + 1 = 12씩 증가하는 것이다.

 

이중 포인터를 이용한 스왑함수

void swap(int **num1, int **num2);

int main() {
    int num1 = 10;
    int num2 = 20;
    int *point_num1 = &num1;
    int *point_num2 = &num2;

    printf("변경전\n");
    printf("num1 : %d\n", *point_num1);
    printf("num2 : %d\n\n", *point_num2);

    swap(&point_num1, &point_num2);

    printf("변경후\n");
    printf("num1 : %d\n", *point_num1);
    printf("num2 : %d\n\n", *point_num2);

}

void swap(int **num1, int **num2){
    int *tmp;
    tmp = *num1;
    *num1 = *num2;
    *num2 = tmp;
}

출력 결과

변경전
num1 : 10
num2 : 20

변경후
num1 : 20
num2 : 10

 

이중 포인터를 사용하여 문자와 문자열을 출력하는 프로그램이다.

char *week[ ] ={"SUN","MON","TUE"}, **ptr;
int i;
ptr = week;

for (int i = 0; i < 3; i++) {
    printf("%s ---", *ptr);
    printf("%c \n", **ptr);
    ptr++;
}

출력 결과

SUN ---S 
MON ---M 
TUE ---T

 

 

'C' 카테고리의 다른 글

C - 문자와 문자열  (0) 2022.03.10
C - 구조체  (0) 2022.03.09
C - 자동변수와 정적변수  (0) 2022.03.08
C - 재귀함수  (0) 2022.03.07
C - 함수  (0) 2022.03.07