티스토리 뷰

반응형

더블 포인터의 이해


더블 포인터도 싱글 포인터와 마찬가지로 메모리 공간의 주소를 저장하는 변수입니다.

다만, 차이가 나는 것은 포인터가 가르키는 대상입니다.

 

1
2
3
4
5
6
7
8
int main()
{
    int num = 10;                    //int형 변수 num에 10 할당
    int *pointer_num = #        //싱글 포인터 선언 및 num의 주소 값 할당
    int **double_pointer = &pointer_num;    //더블 포인터 선언 및 pointer_num의 주소 할당
 
    printf("%d \n",**double_pointer);    //더블 포인터를 통한 num 값 접근
}

 

결론부터 말하면 더블 포인터는 싱글 포인터의 주소 값을 저장하기 위한 포인터라는 것입니다.

위의 코드 3번 라인에서 int형 변수 num을 선언하고 10이라는 값을 할당합니다. 그리고 싱글 포인터인 pointer_num을 선언하고 num 변수의 주소 값을 할당하게 됩니다. 그리고 5번 라인에서 더블 포인터를 선언하고 싱글 포인터인 pointer_num의 주소 값을 할당하고 있습니다.

 

 

더블 포인터에 의한 Call-By-Reference


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void swap(int **num1,int **num2);
 
int main()
{
    int num1 = 10;
    int num2 = 20;
 
    int *point_num1 = &num1;
    int *point_num2 = &num2;
 
    swap(&point_num1, &point_num2);    //싱글 포인터의 주소 값을 넘겨줌
}
 
void swap(int **num1, int **num2)    //싱글 포인터의 주소 값을 더블 포인터 매개변수로 얻어옴
{
    int *tmp;        //임시로 사용할 싱글 포인터
    tmp = *num1;    
    *num1 = *num2;
    *num2 = tmp;
}

 

먼저 swap 함수가 호출 되고 17라인전까지의 포인터 관계 입니다.

 

 다음으로 17라인이 실행 된 후 포인터 관계입니다.

 

임시 공간인 싱글 포인터 tmp가 point_num1이 가리키고 있는 주소 값을 가르키도록 합니다.

다음으로 18번째 라인이 수행 된 후 포인터 관계입니다.

 

point_num1이 가르키는 곳을 point_num2가 가르키는 곳으로 변경합니다.

 

최종적으로 point_num2가 가르키는 곳을 임시로 저장해둔 포인터가 가르키는 곳을 대입합니다. 즉 point_num1이 가르키는 곳을 최종적으로 가르키기 됩니다.

반응형