int *p;
int arr[4];
p = arr; // (1)
p = &arr; // (2)
(1) p = arr;
arr는 배열의 첫 번째 요소를 가리키는 포인터로 변환됩니다.
따라서 p는 배열의 첫 번째 요소(&arr[0])의 주소를 가리킵니다.
p의 타입은 int 이므로, 배열의 각 요소(4바이트 크기)를 순차적으로 참조할 수 있습니다.
(2) p = &arr;
&arr는 배열 자체의 주소를 가리킵니다.
중요한 차이점: &arr의 타입은 int ()[4]입니다. 즉, "크기가 4인 배열의 포인터"입니다.
하지만 p는 int * 타입이므로, 이 경우 컴파일러가 경고나 오류를 발생시킬 수 있습니다(엄격한 타입 검사).
(1) p = arr;
p는 int * 타입 포인터입니다.
예를 들어:
p + 1; // p가 가리키는 주소에서 4바이트(정수 크기) 이동
즉, p + 1은 arr[1]을 가리킵니다.
(2) p = &arr;
&arr의 타입은 int (*)[4]입니다.
중요한 차이점: p + 1은 배열 크기만큼(16바이트) 이동합니다.
예를 들어, p가 &arr를 가리킬 때:
p + 1; // p가 가리키는 배열의 전체 크기(16바이트) 이동
즉, p + 1은 배열 arr 다음에 오는 메모리 공간을 가리킵니다.
int arr[2][3]
//시각적
[1차 행] arr[0][0] arr[0][1] arr[0][2]
[2차 행] arr[1][0] arr[1][1] arr[1][2]
arr: 배열 arr는 2차원 배열이고, arr는 첫 번째 행(arr[0])의 시작 주소를 가리키는 포인터로 평가됩니다.
arr의 타입: int (*)[3] (크기가 3인 정수 배열의 포인터)
arr[0]: arr[0]는 배열의 첫 번째 행을 나타내며, 배열 arr[0]의 시작 주소를 가리킵니다.
arr[0]의 타입: int * (정수 포인터)
p = arr의미:
p는 2차원 배열 arr의 시작 주소를 받습니다.
하지만 arr의 타입은 int (*)[3]이므로, p의 타입도 배열 포인터로 선언되어야 합니다.
p = arr[0]의 의미:
int *p; // p는 정수 포인터
p = arr[0]; // p는 arr[0][0]의 주소를 가리킵니다
p + 1 → 첫 번째 행의 다음 요소(arr[0][1])를 가리킴. (4바이트 단위 이동)
