int arr[] = {0,1,2,3,4};
printf("%p\n", arr);
=> 0x{첫 번째 요소의 메모리 주소}
위의 코드는 C언어에서 배열을 선언하는 코드이다. 변수 arr에는 배열 {0,1,2,3,4}
의 첫 번째 요소의 메모리 주소가 들어간다.
그렇다면 아래와 같은 방식으로 포인터 변수를 선언한 이후 그 포인터 변수에 배열을 할당 하려고 하면 어떻게 될까?
int* arr = {0,1,2,3,4};
printf("%d\n", arr[0]);
=> Segmentation fault: 11
Segmentation fault 오류가 발생하는데 왜냐하면 int* arr
포인터 변수에 배열 할당이 안되기 때문이다. 실제로 포인터 변수 arr
를 확인해보면 배열의 첫 번째 요소의 주소가 아니라 0x0
으로 초기화되어있는 것을 확인할 수 있다.
printf("%p\n", arr);
=> 0x0
그렇다면 왜 int* arr = {0,1,2,3,4}
와 같이 포인터 변수를 사용한 배열 선언이 불가능할까? int arr[] = {0,1,2,3,4}
와 같이 선언한 배열의 int arr[]
도 int* arr
와 같이 배열의 첫 번째 요소를 가리키는 포인터인데 말이다.
그 이유는 {0,1,2,3,4}
배열 선언이 첫 번째 요소의 주소값을 반환하는게 아니라 배열 그 자체를 복사해서 반환하기 때문이다. int* arr
는 배열 그 자체를 담을 수 없는 단순 포인터 변수이기 때문에 선언이 안되는 것이다. 그리고 int arr[]
는 배열 자체를 담지만 코드에서 사용될 때에는 첫 번째 요소를 가리키는 포인터 상수로 동작하기 때문이다.