Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C/C++ 배열 인덱스가 0부터 시작하는 이유

C/C++에서 배열의 인덱스가 0부터 시작하는 데에는 명확한 기술적 이유가 있습니다. 핵심은 포인터 산술(pointer arithmetic)에 있습니다.

포인터 연산 관점에서 본 배열 인덱싱

배열의 이름은 사실상 배열의 첫 번째 요소를 가리키는 포인터처럼 동작합니다. 따라서 배열 인덱스가 0부터 시작하면 다음과 같이 간단하게 구현할 수 있습니다.

a[i] → *(a + i)

여기서 a는 배열의 첫 번째 요소(인덱스 0)의 메모리 주소를 나타내며, 여기에 i를 더하면 정확히 i번째 요소의 주소가 됩니다. 즉, 오프셋 계산이 한 번의 덧셈으로 끝나므로 매우 효율적입니다.

인덱스가 1부터 시작한다면 어떻게 될까?

반면 배열 인덱스가 1부터 시작한다면 첫 번째 요소의 주소는 a - 1이 되어야 하고, 접근 식은 다음과 같이 변경됩니다.

a[i] → *(a + i - 1)

매번 인덱스 접근 시 불필요한 뺄셈 연산이 하나씩 추가되어 컴파일 과정에서 시간이 더 소요되고, 반복문 등에서 배열에 빈번하게 접근하는 경우 프로그램 전체 성능에도 부정적인 영향을 미치게 됩니다.

이러한 이유로 C와 C++에서는 배열 인덱스를 0부터 시작하는 것이 표준으로 자리 잡았습니다.

예제 코드

다음은 포인터 산술을 이용해 배열 요소에 접근하는 간단한 예제입니다.

#include <iostream>
using namespace std;

int main() {
    int array[5] = {7, 7, 7, 6, 6};
    for (int i = 0; i < 5; i++)
        cout << *(array + i) << " ";
    return 0;
}

출력 결과

7 7 7 6 6

위 예제에서 *(array + i)array[i]와 완전히 동일하게 동작합니다. 이처럼 인덱스 0 기반의 포인터 산술은 추가 연산 없이 직관적이고 효율적인 메모리 접근을 가능하게 합니다.