2차원 배열을 포인터에 넣을 떄
자료형 (*포인터이름)[가로];
이렇게 넣잖아요,
근데 이게 가로 길이가 4인 포인터란 거잖아요.
그러면 가로가 4이고 세로길이는 설정한 만큼 포인터에 넣는다는 건가여?
아니면 가로가 4인데 세로 길이는 1인 1차원같은 2차원 배열을 넣는 건가여???
배열을 포인터에 넣는 다는 말이, 포인터 안에, 배열의 메모리 주소를 넣는다는 건가여????
배열과 포인터는 모두 주소입니다.
배열 자체는 포인터에 할당할 수 있습니다.
단, 배열의 원소는 값이므로 포인터에 할당할 수 없습니다.(&를 써야 가능)
그림 37-3을 보고, 그림을 그려서 이해하는 게 좋습니다.
자료형 (*포인터이름)[가로];
간단히
int (*numPtr)[4];
라고 쓰면
numPtr은 pointer to array 4 of int라는 뜻입니다.
int 4개짜리 배열에 대한 포인터라는 뜻입니다. 즉, 4는 가로 크기입니다.
int가 4개 들어갈 수 있는 배열에 대한 포인터입니다.
int arr[3][4];
arr은 array 3 of array 4 of int라고 읽습니다.
int 4개 짜리 배열이 3개층으로 배열된 것을 뜻합니다.
즉, 가로크기가 4, 세로크기가 3인 배열입니다.
arr 자체는 주솟값이므로 적절하게 선언된 포인터에 할당할 수 있습니다.
포인터로는
int (*arrPtr)[4];
arrPtr은 pointer to array 4 of int가 됩니다.
pointer가 array 4 of int를 통으로 가리키게 되어 있습니다.
그래서 arrPtr[1][0]이라고 쓰면
0번째 array 4 of int는 통으로 건너뛰게 됩니다.
즉, 배열의 arr[1][0]과 같습니다.
포인터는 할당된 크기만큼 주솟값을 뛰어넘습니다.
int (*arrPtr)[20];
이렇게 선언했을 때 arrPtr[1][0]이라면 array 20 of int에 해당하는 0번 층은 통으로 건너뛰게 됩니다.(배열처럼 생각하면 편합니다)
*numPtr[4];
하고나서 numPtr[1][0];을 하면 int가 4개인 0번째를 넘어뛰잖아여
글면 1 번째, 2 번째 , 89898 번째 줄도 int가 4개인 건가여?
네, 이해하신 게 맞습니다.
단, 포인터에 할당된 메모리 범위여야 합니다.
할당된 범위를 벗어나서 접근하면 잘못된 값에 접근하게 되고
프로그램이 중단될 수 있습니다.(또는 오동작)