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

C/C++ 포인터 산술 연산 완벽 가이드

포인터 산술(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 언어 프로그래밍 전반에서 매우 유용하게 활용되는 핵심 개념이므로 반드시 익혀두는 것이 좋습니다.