728x90
728x90
포인터의 포인터 (더블포인터)

싱글포인터의 주소값을 저장하는 용도의 포인터

double **ptr2 = &ptr1; //더블포인터

더블포인터의 주소값은 ***로 표현하는데 거의 안쓴다.

double **ptr2 = &ptr1; //더블포인터
double ***ptr3 = &ptr2;

개인적 의문) 포인터의 끝은 어딘거지..?

 

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

포인터가 가리키는 대상을 서로 바꾸는 swap으로
아래는 효과없는 swap 함수의 호출 예제이다.

#include <stdio.h>

int main()
{
    int A = 10, B=20;
    int* pA, *pB;
    pA=&A, pB=&B;
   
    pswap(pA, pB);
   
    // 호출 후
    printf("pA가 가리키는 변수 : %d\n", *pA);
    printf("pB가 가리키는 변수 : %d\n", *pB);
   
    return 0;
}

// pA, pB 주소값이 p1, p2로 전달된다
// 우리는 p1, p2가 아니라 pA, pB가 가리키는 대상이
// 바뀌어야 하므로 잘못된 예
void pswap(int* p1, int* p2) 
{
    int* temp;
    temp=p1;
    p1=p2;
    p2=temp;
}

무조건  포인터가 갔다고 call-by-reference이지 않다. 상대적인 것이다.

 

 

 

더블포인터 입장에서의 진정한 swap의 예
#include <stdio.h>

int main()
{
    int A = 10, B=20;
    int* pA, *pB;
    pA=&A, pB=&B;
   
    pswap(&pA, &pB); //주소값을 바꿔준다
   
    // 호출 후
    printf("pA가 가리키는 변수 : %d\n", *pA);
    printf("pB가 가리키는 변수 : %d\n", *pB);
   
    return 0;
}
 
void pswap(int** p1, int** p2) 
{
    int* temp;
    temp=*p1;
    *p1=*p2;
    *p2=temp;
}

 

 

포인터 배열과 포인터 타입

1차원 배열의 경우 배열이름이 가리키는 대상을 통해 타입이 결정된다.
(2차원 배열은 달라지는데 다음 단원에서 다룰 것)
포인터 배열도 마찬가지이다.

// 포인터 변수 배열의 예
int* arr1[10]; // int형 변수이고 int형 포인터를 가리키니까 int형 더블포인터
double* arr2[20]; 
char* arr3[30];

 

포인터는 언제 사용되는가

함수 내에서 데이터 조작
메모리 동적 할당
자료구조 구현

728x90
728x90
블로그 이미지

coding-restaurant

코딩 맛집에 방문해주셔서 감사합니다.

,

v