int arr1[] = {0,1,2,3,4};
printf("%p\n", arr1);
=> 0x{첫 번째 요소의 메모리 주소}
int* arr2 = {0,1,2,3,4};
printf("%d\n", arr2[0]);
=> Segmentation fault: 11
위의 코드는 C언어에서 배열을 선언하는 코드이다.int arr1[]로 선언하나 int* arr2로 선언하나 어차피 변수에는 배열의 첫 번째 요소의 주소값이 들어있는 것 같은데 왜 int* arr2에는 배열이 들어있지 않고 SEmentation fault가 발생하는 것일까?
그 이유는 {0,1,2,3,4} 배열을 선언하면 메모리 어딘가에 배열 데이터를 놓고 첫 번째 요소의 주소값을 반환하는게 아니라 배열 그 자체를 왼쪽의 변수에 할당하기 때문이다. int* arr는 배열 그 자체를 담을 수 없는 단순 포인터 변수이기 때문에 선언이 안되고 대신 배열의 첫 번째 요소값이 그대로 들어간다. 실제로 sizeof() 함수를 사용해보면 arr1에 포인터가 아니라 배열이 들어있는 것을 확인할 수 있다.
printf("%d\n", sizeof(arr1));
=> 20 (배열의 크기)
(만약 arr1에 배열 첫 번째 요소의 주소가 들어있다면 포인터의 크기인 8이 출력해야함.)
그렇다면 int arr1[] = {...}을 통해 배열을 담은 변수 arr1을 사용하면 배열 첫 번째 요소의 주소를 반환하는 것일까? 이는 C언어 컴파일러가 알아서 arr1을 사용할 때 해당 배열 첫 번째 요소의 주소를 반환하도록 해석해주기 때문이다.