포인터 산술(Pointer Arithmetic)이란?
포인터 산술은 C 언어에서 포인터 변수에 덧셈, 뺄셈, 증가, 감소와 같은 산술 연산을 수행하는 기법입니다. 포인터에 적용할 수 있는 산술 연산은 크게 네 가지로 정리할 수 있습니다.
- 덧셈 : pt + n
- 뺄셈 : pt - n
- 증가 : ++pt 또는 pt++
- 감소 : --pt 또는 pt--
주의할 점은 포인터 산술이 일반 정수 연산과는 다르게 동작한다는 것입니다. 포인터에 값을 더하거나 빼면, 그 값에 포인터가 가리키는 자료형의 크기가 곱해진 만큼 주소가 이동합니다. 예를 들어 int형이 4바이트인 시스템에서 int 포인터에 1을 더하면 주소는 4바이트 증가하고, 5를 더하면 20바이트(4 × 5)만큼 이동합니다.
C 언어 포인터 산술 예제
#include <stdio.h>
int main() {
int val = 28;
int *pt;
pt = &val;
printf("포인터의 주소 : %u\n", pt);
pt = pt + 5;
printf("덧셈 연산 후 : %u\n", pt);
pt = pt - 5;
printf("뺄셈 연산 후 : %u\n", pt);
pt = pt + 1;
printf("증가 연산 후 : %u\n", pt);
pt = pt - 1;
printf("감소 연산 후 : %u\n", pt);
return 0;
}
실행 결과
포인터의 주소 : 3938439860 덧셈 연산 후 : 3938439880 뺄셈 연산 후 : 3938439860 증가 연산 후 : 3938439864 감소 연산 후 : 3938439860
결과 분석
위 프로그램은 포인터 변수 pt에 다양한 산술 연산을 적용한 결과를 보여줍니다. int형이 4바이트인 환경을 기준으로 각 단계를 살펴보면 다음과 같습니다.
- 초기 상태 : pt는 변수 val의 주소(3938439860)를 저장합니다.
- pt + 5 : 5 × 4바이트 = 20바이트가 증가하여 3938439880이 됩니다.
- pt - 5 : 다시 20바이트가 감소하여 원래 주소로 돌아옵니다.
- pt + 1 : 4바이트가 증가하여 3938439864가 됩니다.
- pt - 1 : 4바이트가 감소하여 원래 주소로 돌아옵니다.
이처럼 포인터 산술은 항상 이동 거리 = 연산 값 × 자료형 크기 공식을 따릅니다. 따라서 char형 포인터는 1바이트씩, double형 포인터는 8바이트씩 주소가 이동합니다.
참고 사항
예제에서는 주소값 출력을 위해 %u 서식 지정자를 사용했지만, 이식성(portability)을 고려하면 주소 전용 서식 지정자인 %p를 사용하는 것이 바람직합니다. 또한 포인터 산술은 배열 순회, 문자열 처리, 동적 메모리 관리 등 C 언어 프로그래밍 전반에서 매우 유용하게 활용되는 핵심 개념이므로 반드시 익혀두는 것이 좋습니다.