포인터 배열

포인터/배열 크기 정보

C++에서 배열 이름은 많은 식 문맥에서 첫 원소 포인터로 변환되지만, 배열 자체와 포인터가 같은 것은 아니다. 함수 인자로 넘어가는 순간 길이 정보가 사라지고, 포인터 산술은 원소 크기 단위로 움직이므로 범위 계약을 별도로 가져가야 한다.

01

소유 여부 확인

배열이 실제 저장 공간인지, 포인터가 외부 메모리를 가리키는 관찰자 역할인지 구분한다.

소유권이 없으면 delete 책임도 없다
02

크기 정보 추적

sizeof가 배열 전체 크기를 주는 문맥과 포인터 크기만 주는 문맥을 나눈다.

함수 인자에서는 배열이 포인터처럼 조정된다
03

포인터 산술

p + 1은 byte 하나가 아니라 가리키는 타입의 원소 하나만큼 이동한다.

타입이 산술 단위를 정한다
04

범위 검사

begin/end 또는 pointer와 length를 함께 전달해 out-of-bounds를 막는다.

끝 포인터는 가리키면 안 되는 경계다
05

현대 타입 선택

크기 고정은 std::array, 동적 크기는 vector, 빌린 연속 구간은 span을 고려한다.

raw pointer는 계약을 코드에 덜 드러낸다
T arr[N]
저장 공간 포함 스코프 안에 실제 원소 N개가 연속으로 존재한다.
sizeof(arr)는 전체 byte 크기다
T* p
주소 보관 어딘가의 T를 가리키지만 길이와 소유권은 별도 정보다.
sizeof(p)는 포인터 크기다
Decay
배열에서 포인터로 조정 함수 매개변수와 많은 식에서 첫 원소 포인터로 변환된다.
크기 정보가 사라진다
span
빌린 연속 범위 포인터와 길이를 함께 담아 범위 계약을 드러낸다.
소유하지 않는 view다

코드 확인

sizeof 위치 배열 선언 스코프와 함수 내부에서 sizeof 결과가 어떻게 다른지 확인한다.
길이 전달 raw pointer를 넘기는 함수가 길이 또는 end iterator를 함께 받는지 본다.
범위 반례 빈 배열, 길이 1, 마지막 원소 다음 접근을 테스트로 막는다.