다중포인터
이중 포인터 변수
포인터 변수의 주소 값을 저장하는 것이 이중 포인터 변수(더블 포인터 변수)이다.
아래의 코드는 이중포인터 변수의 예시이다.
이중포인터 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중 포인터 또한 이런 방식으로 생각하면 개념에 조금 더 쉽게 다가갈 수 있을것입니다!