더블 포인터

double num = 3.14;
double *ptr = #
double **dptr = &ptr;
// dptr -> ptr, ptr -> &num
*(*dptr)) == **dptr == num

 

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;
    //*ptr1 = 10, *ptr2 = 20
    
    Swap(ptr1,ptr2);
    //*ptr1 = 10, *ptr2 = 20
    
}

위 코드에서 Swap함수에도 불구하고 ptr1과 ptr2이 가르키는 것이 서로 바뀌지 않았다.

이유는 매개변수인 p1과 p2가 가르키는 것만 바뀌었을 뿐, ptr1과 ptr2가 가르키는 것은 바뀌지 않았기 때문이다.

 

void Swap(int **d1,int **d2)
{
    int *temp = *d1;
    *d1 = *d2;
    *d2 = temp;
}

int main(void)
{
    int num1 = 10, num2 = 20;
    int *ptr1, *ptr2;
    ptr1 = &num1, ptr2 = &num2;
    //*ptr1 = 10, *ptr2 = 20
    
    Swap(&ptr1,&ptr2);
    //*ptr1 = 20, *ptr2 = 10
    
}

&ptr1와 &ptr2을 d1,d2가 받으면, *d1,*d2는 각각 ptr1과 ptr2를 뜻하게 된다.

int *temp는 주소를 받아야 하므로 포인터 변수로 선언했다.

 

int num1 = 10, num2 = 20, num3 = 30;
int *ptr1 = &num1;
int *ptr2 = &num2;
int *ptr3 = &num3;

int *ptrArr[] = {ptr1,ptr2,ptr3};
int **dptr=ptrArr; //ptr1의 주솟값

//*(ptrArr[0]) == *(dptr[0])

**dptr = ptrArr 에서 ptrArr는 num1의 주소 값을 담고 있는 ptr1의 주소 값이므로 더블포인터이다.

 

int arr[3][2];
int arr2[2][3];

//arr : 0
//arr+1 : 8 (4x2)

//arr2 : 0
//arr2 + 1 : 12 (4x3)

//배열의 가로 길이 만큼 커진다.

배열에서 이름 자체는 맨 처음의 주소 값을 의미하는데, 2차원 배열에서 1을 더하면 다음 행의 첫번째의 주소를 가르킨다.

 

int (*ptr) [4];
// 4(가로길이)씩 증가 및 감소하는 포인터 변수

위와 같은 형식으로 포인터 변수를 선언한다.

int arr[2][2]={{1,2},{3,4}}

int (*ptr)[2];

ptr = arr;

// ptr[0][0], ptr[0][1], ptr[1][0], ptr[1][1] 과 같이 똑같이 접근가능

1차원 배열을 가르키는 포인터는 1차원 배열의 이름과 같이 쓸 수 있고,

이와 같이 2차원 배열을 가르키는 포인터도 2차원 배열의 이름과 같은 방식으로 쓸 수 있다.

 

int *arr[4]; // 포인터의 배열
int (*arr2)[4] //배열의 포인터

** 위 두개 혼동 금지!

 

 

void func(int (*parr)[7]){
}

void func2(int parr[][7]){
}

// 위 두개는 매개변수에서만 똑같은 의미를 지닌다.

int main()
{
    int arr[2][7]={}
    func(arr)
}

 

arr[2][1] = 4;
*(arr+2)[1] = 4;
*(arr[2]+1) = 4;
*(*(arr+2)+1) = 4;

//모두 같다.

 

+ Recent posts