배열과 포인터

배열 이름과 첫 요소 주소

배열-포인터 변환, 포인터 산술, 문자열 순회, 다차원 배열 포인터를 구분하면 인덱스와 주소 계산이 연결됩니다.

변환

첫 요소 주소로 해석

함수 인자로 전달될 때 배열 이름은 첫 요소를 가리키는 포인터처럼 전달됩니다.

arr -> &arr[0]
산술

타입 크기만큼 이동

p + 1은 주소를 1바이트가 아니라 가리키는 타입 한 칸만큼 이동합니다.

p + i
차이

배열은 크기를 가진 객체

같은 범위 안에서 sizeof(arr)는 전체 배열 크기, sizeof(p)는 포인터 크기입니다.

sizeof(arr)
문자열

널 문자까지 순회

char* 문자열은 널 문자를 만날 때까지 읽습니다. 배열 크기와 문자열 길이를 같은 값으로 가정하면 범위를 넘기 쉽습니다.

while (*p != '\0')
배열 이름

대부분의 식에서 첫 요소 주소처럼 변환되지만, 배열 객체 자체가 사라지는 것은 아닙니다.

함수 매개변수

int arr[] 매개변수는 실제로 포인터로 받으므로, 원소 개수는 별도 인자로 넘겨야 합니다.

다차원 배열

행의 크기가 포인터 타입에 포함됩니다. int (*)[3]int**는 같은 뜻이 아닙니다.

검산 기준

배열과 포인터 문제를 보면 먼저 “객체의 전체 크기인지, 첫 요소 주소인지, 원소 개수를 누가 알고 있는지”를 분리합니다.