본문 바로가기
프로그래밍 언어/C 언어

[C] 포인터의 포인터(이중 포인터)

by 까망 하르방 2021. 3. 20.
반응형

포인터의 포인터(이중 포인터)

int ** dptr; // int형 이중 포인터

 

포인터 변수는 종류에 상관없이 무조건 주소 값을 저장하는 변수

이중 포인터 변수는 포인터 변수를 가리키는 대상에서 차이가 있습니다.

double num = 3.14;

double *ptr = #

double **dptr = &ptr;

double *ptr2 = *dptr;

ptr과 ptr2와 동일한 대상을 가리키게 되었습니다.

 

잘못된 swap 예제

#include <stdio.h>

void swap(int* x, int* y) {
    int* temp = x;
    x = y;
    y = temp;
}

int main(void) {
    int a = 10, b = 20;
    int* p1, *p2;
    p1 = &a, p2 = &b;

    printf("%d %d \n", *p1, *p2);
    swap(p1, p2);
    printf("%d %d \n", *p1, *p2);
}

변수 a, b 값이 교환되지 않았습니다. 

이는 x와 p1, y와 p2는 별개이기 때문입니다.

① p1의 값이 x에 대입되어 x는 a를 가르키게 됩니다.

    p2의 값이 y에 대입되어 y는 b를 가르키게 됩니다. 

② swap으로 인해 x와 y가 가리키고 있는 값이 바뀝니다.

    이때 p1과 p2가 가리키고 있는 것에는 변화가 없으며, a, b 실제값에도 변화는 없습니다.

 

 

이중 포인터를 이용한 swap()

#include <stdio.h>
void swap(int **dp1, int **dp2) {
    int* temp = *dp1;
    *dp1 = *dp2;
    *dp2 = temp;
}
int main(void) {
    int a = 10, b = 20;
    int*p1, *p2;
    p1 = &a, p2 = &b;

    printf("%d %d \n", *p1, *p2);

    swap(&p1, &p2);

    printf("%d %d \n", *p1, *p2);
}

swap이 정상적으로 성공 

① p1의 주소를 dp1에 전달, p2의 주소를 dp2에 전달

② dp1, dp2가 가리키고 있는 값에 저장된 값을 swap 합니다.

    즉, dp1의 실제값(p1), dp2의 실제값(p2)가 교환되어 p1,p2가 가리키고 있는 값이 달라집니다.

 

배열도 마찬가지로 적용할 수 있습니다.

배열의 이름이 하나의 포인터이므로 아래와 같이 사용 합니다.

#include <stdio.h>

void swap(int **dp1, int **dp2) {
    int* temp = *dp1;
    *dp1 = *dp2;
    *dp2 = temp;
}

int main(void) {
    int num1 = 10, num2 = 20, num3 = 30;

    int* p1 = &num1, * p2 = &num2, * p3 = &num3;

    int* ptrArr[] = { p1, p2, p3 };

    int** dptr = ptrArr;

    printf("%d %d %d \n", *(ptrArr[0]), *(ptrArr[1]), *(ptrArr[2]));
    printf("%d %d %d \n", *(dptr[0]), *(dptr[1]), *(dptr[2]));
}

포인터 변수의 활용은 자료구조나 알고리즘에서 주로 이용되며

현재로는 함수 내에서 함수 외부에 선언된 변수에 접근하는 방법으로 이해.

 

 

자주 사용되는 swap 예시

#include <stdio.h>

void swap(int * x, int * y) {
        // 주소에 저장된 실제값들을 교환
        int temp = *x;
        *x = *y;
        *y = temp;
}

int main(void) {
        int a = 10, b = 20;
        printf("%d %d \n", a, b);

        // 참조하는 주소값을 전달
        swap(&a, &b);

        printf("%d %d \n", a, b);
}

 

 

반응형

댓글