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 때문이다. 크기 계산, 재지정, 함수 전달에서는 배열 자체와 포인터 변수를 명확히 나누어야 한다.