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