C

이중 포인터

yeooniyeoon 2022. 9. 22. 23:50
728x90
SMALL

이중 포인터

포인터의 포인터를 이중 포인터 또는 더블 포인터라고 한다.

이중 포인터 변수는 * 연산자를 두번 사용하여 나타낸다.

싱글 포인터 변수는 변수의 주소를 저장한다.

이중 포인터 변수도 마찬가지로 주소를 저장하는데 그 대상이 포인트 변수라는 점만 다르다.

 

int num = 100;
int * ptr = #
int ** pptr = &ptr;

 

위와 같이 사용할 수 있다.

 

 

num == *ptr == **pptr 모두 num을 의미한다.

 

int num = 100;
int * ptr = #
int ** pptr = &ptr;

num = 200;
*ptr += 10;
**ptr += 20;

printf("num = %d \n", num);
printf("*ptr = %d \n", *ptr);
printf("**ptr = %d \n", **ptr);

 

위 코드는 결국 num에 200이라는 수를 저장하고 10을 더하고 20을 더한 것과 마찬가지이다.

실행 결과를 확인해보면 num == *ptr == **pptr 인 것을 확인할 수 있다.

 

 

 

 

 

이중 포인터의 call-by-reference

 

void swap(int * p1, int * p2){
	int * temp = p1;
    p1 = p2;
    p2 = temp;
}

int main(void){
	int num1=10, num2=20;
    int *ptr1, *ptr2;
    ptr1=&num1, ptr2=&num2;
    
    swap(*ptr1, *ptr2);
    printf("*ptr1=%d, *ptr2=%d", *ptr1, *ptr2);
    return 0;
}

 

이 코드의 swap 함수는 매개변수로 전달받은 두 변수의 값을 교환하는 함수이다.

그러나 위 코드를 실행하면 변경이 되지 않고 값이 그대로 출력된다.

 

문제는 swap 함수에 매개변수를 전달하는 과정에 있다.

swap 함수는 포인터 변수 ptr1과 ptr2가 가리키는 값을 전달받아 각각 p1과 p2에 저장한다.

그리고 p1과 p2의 값을 교환한다.

다시 메인 함수로 돌아와 출력문을 실행하는데 이때 ptr1과 ptr2가 가리키는 값을 출력한다.

실제로 p1과 p2의 값은 교한이 되었지만 ptr1과 ptr2는 여전히 변경된 것이 없다.

 

 

그렇다면 어떻게 코드를 수정해야할까?

swap 함수의 매개변수를 이중 포인터로 변경 후 ptr1과 ptr2의 주소를 전달받아야 한다.

void swap(int ** p1, int ** p2){
    int * temp = *p1;
    *p1 = *p2;
    *p2 = temp;
}

int main(void){
    int num1=10, num2=20;
    int *ptr1, *ptr2;
    ptr1=&num1, ptr2=&num2;
    
    swap(&ptr1, &ptr2);
    printf("*ptr1=%d, *ptr2=%d", *ptr1, *ptr2);
    return 0;
}

 

위와 같이 코드를 수정하면 비로소 ptr1과 ptr2의 값이 교환되는 것이다.

p1에는 ptr1의 주소가, p2에는 ptr2의 주소가 저장되고 

temp에 ptr1의 값을 저장 ==> ptr1에 ptr2의 값을 저장 ==> ptr2에 temp(ptr1) 값 저장

 

swap 함수의 값이 교환되는 부분의 코드는 

temp = ptr1;

ptr1 = ptr2;

ptr2 = temp;    와 같다.

 

 

 

728x90
반응형
SMALL