1차원 int 형 배열에 대해 생각해보자.
int arr[3] ; // 이 배열의 이름도 사실 포인터이다.
와 같은 길이가 3인 배열을 선언했을때,
배열의 이름 arr은 포인터 변수와 똑같은 역할을 한다. 물론 int * arr 로 선언을 해야 포인터이지만, 배열은 그렇게 선언을 하지 않아도 포인터이다.
arr은 배열의 첫번째 요소(=0번째 인덱스)를 가리키는 포인터이다.
다만 상수(const)로 가리키는 대상은 바꿀 수 없는 '상수 포인터'
이다.
int main(void)
{
int arr[3] = {10, 20, 30} ;
int *ptr = &arr[0]; //
printf("%d %d \m", ptr[0], arr[0]);
printf("%d %d \m", ptr[1], arr[1]);
printf("%d %d \m", ptr[2], arr[2]);
return 0;
}
10 10
20 20
30 30
arr 은 int 형 포인터이니 int 포인터를 대상으로 배열접근을 위한 index 연산을 진행할 수 있다. 실제로 포인터 변수 ptr을 대상으로 각 인덱스 ptr[0], ptr[1] ptr[2]와 같은 방식으로 메모리에 접근이 가능하다.
결론 : (int *ptr = &arr[0]) == arr
배열의 이름은 0번째 인덱스를 가리키는 포인터이다. 다만, 변경 불가능한 상수다.