C

배열 포인터

MDanderson 2023. 12. 13. 16:00

arr와 &arr 사이의 차이를 이해하기 위해서는 배열과 포인터의 관계, 그리고 C 언어에서의 메모리 주소 처리 방식을 이해해야 합니다.

arr는 배열의 이름이며, C에서 배열의 이름은 배열의 첫 번째 원소를 가리키는 포인터로 사용됩니다. 즉, arr는 배열의 첫 번째 원소인 arr[0]의 메모리 주소를 나타냅니다. 배열 이름을 포인터처럼 사용할 수 있기 때문에, arr과 &arr[0]은 동일한 주소 값을 가집니다.

반면, &arr는 전체 배열의 주소를 나타냅니다. 이 표현은 배열 전체를 가리키는 포인터로, 그 타입은 int (*)[3]입니다. 여기서 중요한 점은 arr와 &arr이 동일한 주소 값을 가지고 있지만, 그 타입이 다르다는 것입니다. arr는 int* 타입이고, &arr은 int (*)[3] 타입입니다.

 

이 예시에서 두 printf 문은 동일한 주소를 출력하지만, 이들이 가리키는 대상의 타입은 다릅니다.

arr: int* 타입으로, 배열의 첫 번째 원소의 주소.
&arr: int (*)[3] 타입으로, 전체 배열의 주소.
이 차이는 포인터 산술 연산이나 함수 매개변수 전달 시 중요한 역할을 합니다. 예를 들어, arr + 1은 배열의 두 번째 원소를 가리키는 반면, &arr + 1은 배열 전체 끝의 다음 주소를 가리키게 됩니다.