책 정리/윤성우의 열혈 C

Chapter 17. 포인터의 포인터

190730 2019. 9. 27. 18:38

포인터의 포인터는 포인터 변수를 가리키는 또 다른 포인터 변수를 뜻한다.

흔히 '이중 포인터' 또는 '더블 포인터'라 부른다.

선언방법 : int ** ptr;

 

double num = 3.14;

double * ptr = #

double ** dptr = &ptr;

double *ptr2 = *dptr              // num의 주소값이 저장됨.  *dptr에는 ptr의 값 (ptr은 싱글 포인터로 num의 주소값이

                                            저장되어있다) 이 저장되어있으므로 그 값을 ptr2에 저장. 결국 ptr2 -> &num이 된다

 

포인터 변수도 변수이므로 일반 변수와 같이 &연산자 이용이 가능하고 '더블 포인터'에 주소 값 저장이 가능하다.

 

접근방법 : *dptr = . . . . .;            //포인터 변수 ptr을 의미함

              *(*dptr) = . . . . .;         //변수 num을 의미함. 괄호가 생략이 가능하여 **dptr로 표현이 가능하다.

 

---------------------------------------------------------------------------------------------------------------------------------

 

포인터 변수 대상의 Call =-by-reference

 

void swap(int **dp1, int **dp2)

{                                          

     int* temp;                  //포인터 변수 temp 선언

     temp = *dp1;             //temp에 *dp1(ptr1의 값 = n1의 주소 값)을 저장함

     *dp1 = *dp2;             //*dp1에 *dp2 를 저장 (ptr1에 ptr2를 저장)          

     *dp2 = temp;            //*dp2에 temp를 저장 (ptr2에 이전ptr1의 값을 저장)

}

 

 

포인터 배열과 포인터 배열의 포인터 형

int * arr1[20]   // 길이가 20인 int형 포인터 배열 arr1      이고 포인터 형은 int형 더블 포인터 이다.

int arr[30]      // 배열이름 arr은 int형 포인터

 

더블포인터에 포인터 배열의 주소를 저장시키면 더블 포인터도 배열과 마찬가지로 접근이 가능하다.

ex)   int* ptrArr[10];

       int** dptr = ptrArr;

       *dptr[0] == *ptrArr[0]

 

 

---------------------------------------------------------------------------------------------------------------------------

 

17-2 다중 포인터 변수와 포인터의 필요성

포인터 변수의 선언에 있어서 * 연산자가 둘 이상 사용되어 선언되는 포인터 변수를 가리켜 '다중 포인터 변수'라 한다.

그리고 포인터 변수 선언 시 * 연산자는 얼마든지 추가될 수 있다.

 

이중 포인터를 가리키는 삼중 포인터

int ***tptr;   //tptr은 삼중 포인터 변수

 

포인터 변수           -> 변수를 가르키는 용도로, 변수의 주소 값이 저장된다.

이중 포인터 변수    -> 포인터 변수를 가르키는 용도로, 포인터 변수의 주소 값이 저장된다.

삼중 포인터 변수    -> 이중 포인터 변수를 가르키는 용도로, 이중 포인터 변수의 주소 값이 저장된다.

 

삼중 포인터가 사용되는 범위는 그리 넓지 않으므로, 우리가 구현하는 프로그램에 삼중 포인터가 등장한다면 포인터의 오용 및 남용은 아닌지, 잘못된 방식으로 접근하고 있는 것은 아닌지 확인해 볼 필요가 있다.

 

포인터는 자료구조를 공부하게 되면 포인터의 필요성을 보다 확실히 느끼고 알 수 있게 된다.

 

포인터는 함수 내에서 함수 외부에 선언된 변수에 접근하는 방법을 제시해 준다.