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

C++ 배열 요소 접근의 숨겨진 문법: index[배열이름] 표기법

배열(Array)은 동일한 데이터 타입의 요소들을 연속된 메모리 공간에 저장하는 선형 자료구조입니다. 배열의 개별 요소에 접근할 때는 일반적으로 배열이름[인덱스] 형태의 표준 문법을 사용합니다.

일반적인 배열 접근 방법

array_name[index];

예제 코드

#include <iostream>
using namespace std;
int main( ){
    int arr[2] = {32,65};
    printf("First Element = %d\n",arr[0]);
    printf("Second Element = %d\n",arr[1]);
    return 0;
}

실행 결과

First Element = 32
Second Element = 65

그런데 C++에는 위 코드와 완전히 동일한 결과를 출력하는 또 다른 방법이 존재합니다. 바로 인덱스와 배열 이름의 위치를 서로 뒤바꾸는 것입니다.

흔하지 않은 배열 접근 방법

index[array_name];

예제 코드

#include <iostream>
using namespace std;
int main( ){
    int arr[2] = {32,65};
    printf("First Element = %d\n",0[arr]);
    printf("Second Element = %d\n",1[arr]);
    return 0;
}

실행 결과

First Element = 32
Second Element = 65

겉보기에는 문법 오류처럼 보이지만, 이 코드 역시 정상적으로 컴파일되고 같은 값을 출력합니다. 그 이유를 두 가지 경우로 나누어 살펴보겠습니다.

동작 원리: 포인터 산술 연산

C++ 컴파일러는 배열 첨자 연산을 내부적으로 포인터 덧셈으로 변환합니다.

  • arr[0]*(arr + 0)으로 해석됩니다. 즉, 배열의 시작 주소에서 0만큼 이동한 위치의 값을 가리키는 포인터입니다.
  • 0[arr]*(0 + arr)로 해석됩니다. 덧셈은 교환 법칙이 성립하므로, 앞선 표현과 완전히 동일한 메모리 주소를 가리킵니다.

결국 두 표기법 모두 같은 메모리 주소를 참조하기 때문에 동일한 결과를 반환하는 것입니다. 다만 index[array_name] 형태는 가독성을 크게 해치고 실무에서 혼란을 일으킬 수 있으므로, 언어의 유연성을 보여주는 흥미로운 사례로 이해하고 실제 코드에서는 표준 문법인 array_name[index]를 사용하는 것이 좋습니다.