C/C++에서 배열 요소에 접근하는 가장 일반적인 방법은 array[i]와 같은 인덱스 표기법입니다. 하지만 배열 이름 자체가 첫 번째 요소를 가리키는 포인터로 해석된다는 점을 이용하면, *(array + i)와 같은 포인터 연산 방식으로도 동일한 결과를 얻을 수 있습니다. 아래는 이러한 흔하지 않은 표현 방식을 보여주는 간단한 C++ 프로그램입니다.
예제 코드
#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) 부분입니다. 그 동작 원리는 다음과 같습니다.
- 배열 이름의 포인터 성질: C/C++에서 배열 이름은 대부분의 표현식에서 첫 번째 요소를 가리키는 포인터로 자동 변환(decay)됩니다. 즉,
array는&array[0]과 같은 의미를 갖습니다. - 포인터 산술:
array + i는 배열의 시작 주소에서i개의 요소 크기만큼 이동한 주소를 나타냅니다. 예를 들어int형 배열이라면i * sizeof(int)바이트만큼 이동합니다. - 역참조(dereference):
*연산자는 해당 주소에 저장된 값을 읽어옵니다.
결국 *(array + i)는 array[i]와 완전히 동일하게 동작하며, 실제로 컴파일러 내부적으로도 인덱스 표기법은 포인터 연산으로 변환되어 처리됩니다.
정리
이처럼 포인터 연산을 활용하면 인덱스 없이도 배열 요소에 순차적으로 접근할 수 있습니다. 두 표현 방식은 기능적으로 같지만, 코드의 가독성과 유지보수 측면에서는 일반적으로 array[i] 형태의 인덱스 표기법이 더 권장됩니다. 다만 포인터와 배열의 관계를 깊이 이해하는 데는 이러한 예제가 매우 유용합니다.