C

다중포인터

오군_ 2023. 5. 18. 16:20
반응형
이중 포인터 변수

포인터 변수의 주소 값을 저장하는 것이 이중 포인터 변수(더블 포인터 변수)이다.

 

 

아래의 코드는 이중포인터 변수의 예시이다.

이중포인터 dptr이 ptr의 주소 값을 저장합니다.

*dptr은 ptr의 주소 값이 나오며 한번더 포인터연산자를 써서

**dptr을 하게 되면 ptr의 주소값에 있는 num의 값에 접근하게 됩니다.

 

*dptr은 double포인터인 ptr1의 주소값을 가지고 있기에 double포인터 ptr2에 할당이 가능합니다.

ptr2 또한 num의 주소값을 참조하게 되어서 *ptr2의 값을 변경하면 num의 값이 변경되게 됩니다.

double num = 3.14; 	// 100번지
double *ptr = # 	// 200번지
double **dptr = &ptr;	// 300번지
double* ptr2;	// 400번지

printf("%9p %9p \n", ptr, *dptr);	// 100번지 100번지
printF("%9g%9g\n", num, **dptr);	// 3.14 3.14

ptr2 = *dptr;
*ptr2 = 10.99;
printf("%9g %9g \n", num, **dptr);	// 10.99 10.99

 

 

 

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

int arr1[5]; 에서 arr1의 포인터형은 int* 이렇게 표기합니다

따라서 int* arr1[10]; 에서 arr의 포인터 형은 int** 입니다.

int arr1[5];
int* ptr1 = arr1;	// 자료형(타입)이 같아서 할당이 된다.

int* arr2[10];
int** ptr2 = arr2;	// 자료형(타입)이 같아서 할당이 된다.

 

 

삼중 포인터

삼중 포인터는 아래의 코드처럼 int*** tptr; 이렇게 선언이 가능하며

이중 포인터 변수의 주소 값을 담는 용도로 선언됩니다.

int num = 10;
int* ptr = #
int** dptr = &ptr;
int*** tptr = &dptr;

printf("%d %d \n", **dptr, ***tptr);	// 100 100 출력

 

 

포인터의 필요성
  • scanf함수와 같이 외부에 선언된 변수의 접근을 허용하기 위해서
  • 메모리의 동적 할등
  • 자료구조

 

 

다중 포인터 이해(정리)

처음 다중 포인터를 접한다면 정말 너무 당황하게 됩니다.

주소에 주소를 담고 거기에 또 주소를 담는다는 이론은 쉽게 이해할 수도 있지만

실제로 쓸려고 하면 막막하게 됩니다. 물론 이해하기도 벅찹니다.

 

저는 그래서 다중 포인터를 박싱과 언박싱으로 예시를 들겠습니다.

int** dtpr은 int형 이중포인터인데 자료형과 같이 *연산자가 같이 쓰일경우는

선언할때입니다. 선언할때 *의 갯수가 박싱의 개념이라고 생각합니다.

int**형 같은 경우는 내용물을 작은박스에 그 후 작은박스를 큰박스에 담는 느낌으로 말입니다.

 

선언후에 int형 이중 포인터 변수에 *연산자를 붙이면 이중포인터에 들어와 있는 값을

뜻하는데 그때의 *는 언박싱의 개념으로 말입니다. 

int** dtpr은 **dtpr처럼 *연산자가 두개가 있으면 박스를 두번 열어서 그 안의 내용물을 꺼낸다라고 

생각하면 이중포인터가 나름 친근하게 다가올 수 있습니다.

 

N중 포인터 또한 이런 방식으로 생각하면 개념에 조금 더 쉽게 다가갈 수 있을것입니다!

 

반응형

 

 

반응형