먼저 포인터 변수 b는 배열 a의 첫 번째 주소 즉 &a[0]를 가진다고 했습니다. 배열 a의 두 번째 주소를 가리키게 하려면 배열 a[0]의 주소 값에 +1을 하면 됩니다. 그리고 나면 포인터 변수 b는 a[1]의 주소를 갖게 됩니다. 그림 8-23와 같이 정리하면, b + i를 통해 배열의 a[i]번째 요소에 접근할 수 있습니다.
잠깐만요
배열의 인덱스가 0부터 시작하는 이유
배열의 인덱스는 1이 아닌 0부터 시작하므로 int a[3];이라고 배열을 선언할 경우 배열은 a[0], a[1], a[2] 세 개로 구성됩니다. 그렇다면 왜 1이 아닌 0부터 시작하는 것일까요?
배열의 이름인 a는 곧 배열의 첫 번째 인덱스 a[0]의 주소 값을 의미합니다. 포인터 연산 관점에서 a는 배열의 첫 번째 메모리 주소 &a[0]를 의미하고, a + 1은 배열의 두 번째 메모리 주소 &a[1]을 의미합니다. 만약 배열의 인덱스를 1부터 시작한다면 a + 1은 &a[2]를 의미할 것입니다. 즉, 표현 방식의 통일성이 없어지면서 코드의 가독성을 떨어뜨릴 수 있으며, 심지어 오류를 일으킬 수도 있습니다.
다음 예제 코드를 실행하여, 배열의 인덱스가 0으로 시작해야 포인터 연산 및 배열의 주소 값 계산 시 표현의 통일성을 유지할 수 있음을 확인해 보세요.
좀 더 자세한 내용은 9.9절에서 설명합니다.