C포인터와 메모리

const 포인터

포인터가 가리키는 값이 상수인지, 포인터 자신이 고정인지에 따라 달라지는 `const` 배치를 정리합니다.

마지막 수정 2026년 3월 19일

기본 패턴

c
int value = 10;
const int *read_only = &value;
int *const fixed_ptr = &value;
const int *const both_fixed = &value;

설명

  • const가 포인터 선언 어디에 붙는지에 따라 "값을 못 바꾸는지", "포인터 대상을 못 바꾸는지" 의미가 달라집니다.
  • const int *p는 값을 읽기만 하겠다는 뜻이고, int *const p는 포인터가 다른 곳을 가리키지 않겠다는 뜻입니다.
  • 둘 다 함께 쓰면 포인터가 가리키는 값도 수정하지 않고, 포인터 자체도 고정됩니다.
  • API 설계에서 const를 잘 붙이면 함수가 무엇을 바꾸는지 훨씬 분명해집니다.

짧은 예제

c
#include <stdio.h>

void print_value(const int *ptr) {
    printf("%d\n", *ptr);
}

int main(void) {
    int score = 95;
    int *const keeper = &score;
    *keeper = 100;
    print_value(keeper);
    return 0;
}

빠른 정리

항목설명
const int *p가리키는 값을 수정하지 않겠다는 의미
int *const p포인터 자신이 다른 주소를 가리키지 않음
const int *const p값도 포인터도 모두 고정
읽기 전용 API입력만 받는 포인터 인자에 const를 붙이면 의도가 분명해짐
qualifier 위치const가 어디를 수식하는지 해석하는 습관이 중요

주의할 점

const를 억지로 제거하는 캐스팅은 원본 객체가 실제 상수 메모리일 때 심각한 문제를 일으킬 수 있습니다. 경고를 없애기 위한 캐스팅은 특히 조심해야 합니다.