int main(void)
{
double num = 3.14;
double *ptr = # // num의 주솟값을 가리키는 ptr 포인터변수
double **dptr = &ptr; // *dptr == ptr -> *(*dptr) == *ptr
}
포인터 변수의 주소값을 저장하는 것이 이중 포인터 변수이다.
*dptr 은 ptr을 가리키고, **dptr은 num을 의미한다.
이번엔 이러한 구조의 구조를 포인터형식을 코드화 해보자.
#include <stdio.h>
int main()
{
double num = 3.14;
double *ptr = #
double **dptr = &ptr;
double *ptr2 = 0;
printf("%9p %9p \n", ptr, *dptr);
printf("%9g %9g \n", num, **dptr);
ptr2 = *dptr;
// ptr2 = ptr
*ptr2 = 10.99;
//ptr2포인터를 이용해 num의 값을 10.99로 변경
printf("%9g %9g \n", num, **dptr);
return 0;
}
0x7ffeefbff3e0 0x7ffeefbff3e0
3.14 3.14
10.99 10.99
1차원 배열의 경우 배열의 이름을 가리키는 대상을 기준으로 메모리 접근방법과 포인터 연산시 주소값의 증감치가 결정 되었다.2차원 배열에서는 포인터은 가로의 길이가 아주 밀접한 관련이 있다.
1차원 배열에서 (배열 + 1) 을 하면 포인터의 타입만큼 증가가 되었는데,
2차원 배열에서는 (포인터 타입 * 가로의 길이) 만큼 증가가 된다.
void ShowArayElem(int (*arr2)[3], int len){...};
void AddArayElem(int (*arr2)[3], int len, int add){...};
int (*arr2)[3] 대신하여 int arr[][3] 로 2차원 배열을 함수로 전달할 수도 있다.
void ShowArayElem(int arr2[][3], int len){...};
void AddArayElem(int arr2[][3], int len, int add){...};