본문 바로가기
휴지통/C 프로그래밍

포인터의 포인터

by 신재권 2021. 1. 21.

1. 포인터의 포인터에 대한 이해

포인터의 포인터는 포인터 변수를 가리키는 또 다른 포인터 변수를 뜻하는 것으로서 흔히 '이중 포인터' 또는 '더블 포인터'라 부르며, 다음과 같이 포인터 변수의 선언에 사용되는 *연산자를 두개 이어서 선언한다.

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

-포인터 변수를 가리키는 이중 포인터변수 (더블 포인터 변수)

포인터 변수는 종류에 상관없이 무조건 주소 값을 저장하는 변수이다. 다만 차이가 나는 것은 포인터 변수가 가리키는 대상일 뿐이다.

int main(void){
double num= 3.14;
double *ptr = #   //변수 num의 주소값 저장
}

위의 코드에서 변수 num과 포인터 변수 ptr의 차이점과 공통점을 정리하자면,

공통점 : 둘 다 변수이다. 따라서 값의 저장이 가능하다.

차이점 : 저장하는 값의 종류(유형)이 다르다.

이렇듯 ptr도 메모리 공간에 할당이 되는 변수이다. 이를 대상으로도 &연산이 가능하며, 이 때 반환되는 주소 값은 'double형 더블 포인터 변수'에 저장이 가능하다. 따라서 싱글 포인터 변수 ptr을 대상으로 다음과 같은 문장 구성이 가능하다.

double **dptr = &ptr;

그리고 위 문장을 추가함으로써 포인터 변수 ptr과 dptr, 그리고 변수 num의 관계는

dptr -> ptr -> num

그리고 위 상태에서는 dptr을 대상으로 다음과 같은 방식으로 포인터 변수 ptr과 변수 num에 접근이 가능하다.

*dptr = ....; //*dptr은 변수 ptr을 의미함.

*(*dptr)= .... ; //*(*dptr)은 변수 num을 의미함.

그리고 *(*dptr)에서 괄호는 생략이 가능하기 때문에 **dptr로 표현이 가능하고, 이것이 일반적인 표현이다.

-포인터 변수 대상의 Call by refernce

일전에 우리는 두 변수에 저장된 값을 서로 바꿔서 저장하는 함수를 정의 한적이 있다.

void Swap(int *ptr1, int *ptr2){
int temp =*ptr1;
*ptr1 = *ptr2;
*ptr2= temp;
}

이 함수의 몸체를 살펴보면 결국 바뀌지 않는다 .

당연히 함수에 선언된 변수와 메인에 선언된 변수는 별개이기 때문에 바뀌지 않는다.

어떻게 해야 바꿀수 있을까/

이를 위해서는 포인터 변수 ptr1과 ptr2에 직접 접근이 가능해야 한다.

그래서 이 두 변수에 저장된 값을 서로 바꿔줘야 한다. 그리고 이를 위해서는 int형 더블 포인터가 매개 변수로 선언되어야 한다.

void Swap(int **ptr1, int **ptr2){
int temp =*ptr1;
*ptr1 = *ptr2;
*ptr2= temp;
}

===== 
main 부분
====
Swap(&p1, &p2); 선언되었다고 가정 , 주소를 대입해야 한다.

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

int *arr1[20] ; //길이가 20인 int형 포인터 배열 arr1

double *arr2[30] ; //길이가 30인 double형 포인터 배열;

int arr[30]; //배열 이름 arr는 int형의 포인터

1차원 배열이름의 포인터 형을 결정짓는것은 어렵지 않다. 배열 이름이 가리키는 요소의 자료형만 고려하면 되기 때문이다.

배열이름이 가리키는 첫번째 요소의 자료형에 따라 포인터 형이 결정된다.

arr1이 가리키는 첫 번째 요소는 int형 싱글포인터이니, 배열이름 arr1은 int형 더블 포인터가 된다.

그리고 arr2가 가리키는 첫번째 요소는 double형 싱글 포인터이니, 배열이름 arr2는 double형 더블 포인터가 된다.

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

다음과 같이 *연산자가 세 개 삽입된 포인터 변수를 가리켜 일반적으로 '삼중 포인터 변수'라고 부른다.

int ***tptr;

삼중 포인터 변수는 이중 포인터 변수를 가리키는 용도로, 이중 포인터 변수의 주소 값을 저장하는 용도로 사용된다.

'휴지통 > C 프로그래밍' 카테고리의 다른 글

함수 포인터와 void 포인터  (0) 2021.01.21
다차원 배열과 포인터의 관계  (0) 2021.01.21
다차원 배열  (0) 2021.01.21
포인터와 함수에 대한 이해  (0) 2021.01.21
포인터와 배열  (0) 2021.01.21