C포인터와 메모리

포인터 산술

`ptr + 1`이 바이트가 아니라 원소 단위로 이동하는 C 포인터 산술의 핵심을 정리합니다.

마지막 수정 2026년 3월 19일

기본 패턴

c
int data[] = {10, 20, 30};
int *ptr = data;
printf("%d\n", *(ptr + 1));

설명

  • 포인터에 정수를 더하거나 빼면 바이트 수가 아니라 가리키는 타입의 원소 개수만큼 이동합니다.
  • ptr + 1int *라면 다음 int 원소를 가리키고, double *라면 다음 double을 가리킵니다.
  • 배열 인덱싱 ptr[i]는 내부적으로 *(ptr + i)와 같은 의미입니다.
  • 같은 배열 내부 원소끼리 포인터를 빼면 두 포인터 사이의 원소 개수를 얻을 수 있습니다.

짧은 예제

c
#include <stdio.h>

int main(void) {
    int values[] = {3, 6, 9, 12};
    int *ptr = values;

    for (int i = 0; i < 4; i += 1) {
        printf("%d ", *(ptr + i));
    }
    printf("\n");
    return 0;
}

빠른 정리

항목설명
ptr + nn개의 원소만큼 앞으로 이동
ptr - nn개의 원소만큼 뒤로 이동
ptr[i]*(ptr + i)와 같은 의미
포인터 차이같은 배열 안이면 원소 개수 차이를 얻을 수 있음
타입 의존 이동이동 간격은 포인터 타입 크기에 따라 달라짐

주의할 점

포인터 산술은 같은 배열 범위 안에서만 안전하게 생각해야 합니다. 다른 객체 메모리로 넘어간 포인터를 역참조하면 정의되지 않은 동작이 됩니다.