array decay

배열 이름과 포인터는 주소처럼 보여도 같은 객체가 아니다

배열 이름은 많은 식에서 첫 원소 주소로 변환되지만, 배열 자체의 크기, 길이, 재지정 가능성은 포인터 변수와 다르게 유지된다.

int arr[5] 배열 전체
arr[0] 첫 원소 주소
arr[1] sizeof(int) 뒤
arr[2] 포인터 산술 대상
int* p 주소를 담는 별도 변수
sizeof 배열과 포인터 결과 분리
배열 이름과 포인터 변수 비교
질문 배열 이름 arr 포인터 변수 p 읽는 기준
재지정 다른 주소를 대입할 수 없다. p = &arr[2]처럼 바꿀 수 있다. 이름이 객체인가, 주소 변수인가를 먼저 본다.
크기 sizeof(arr)는 전체 바이트 크기다. sizeof(p)는 주소 변수 크기다. 함수 인자에서는 배열 크기 정보가 유지되지 않는다.
대입 배열끼리 직접 대입할 수 없다. 다른 포인터 값으로 교체할 수 있다. 요소 복사와 주소 복사를 분리한다.
인덱싱 arr[i]는 배열 원소 접근이다. p[i]도 주소 기준 산술 접근이다. 겉 문법보다 기준 주소와 길이 책임을 확인한다.
안전한 해석

배열과 포인터가 비슷해지는 순간은 decay 때문이다. 크기 계산, 재지정, 함수 전달에서는 배열 자체와 포인터 변수를 명확히 나누어야 한다.