기본 포인터와 const 한 개 (어디에 붙느냐에 따라 다름)
먼저, 일반 포인터 구조 복습
int a = 10;
int *p = &a;
여기서 p는 두 가지를 바꿀 수 있습니다:
- p 자신이 가리키는 대상을 바꿀 수 있습니다 → p = &b;
- p가 가리키는 값(= a의 값)도 바꿀 수 있습니다 → *p = 20;
즉, 포인터는 "가리키는 대상도 바꾸고", "값도 바꿀 수 있다" → 자유로운 상태입니다.
상황 1: const int *p;
또는
int const *p;
가리키는 대상의 값을 바꿀 수 없다.
하지만 p가 가리키는 대상을 바꾸는 건 가능하다.
💡 예시:
int a = 10, b = 20;
const int *p = &a; // 또는 int const *p = &a;
*p = 15; // 오류! 값 변경 불가
p = &b; // OK! 대상 변경은 가능
- 읽기 전용 포인터라고도 부릅니다.
- *p = ... 금지
- p = ... 허용
"나는 어떤 값을 참조하긴 하지만, 그 값을 바꾸진 않을 거야."
상황 2: int *const p = &a;
p가 가리키는 대상을 바꿀 수 없다.
하지만 p가 가리키는 값은 바꿀 수 있다.
💡 예시:
int a = 10, b = 20;
int *const p = &a;
*p = 15; // OK! 값은 바꿀 수 있음
p = &b; // 오류! 대상 변경 불가
"나는 처음 가리킨 대상만 바라볼 거야. 대신 그 값은 내가 바꿀 수 있어."
상황 3: const int *const p = &a;
또는
int const *const p = &a;
값도 못 바꾸고, 대상도 못 바꿈 → 완전 상수화
💡 예시:
int a = 10, b = 20;
const int *const p = &a;
*p = 15; // 오류! 값 변경 불가
p = &b; // 오류! 대상 변경 불가
"나는 a만 바라보면서, 그 안에 뭐가 있든 바꿀 생각은 없어."
요약표: const 위치에 따른 의미 차이
선언 | 의미 | 가르키는 값 변경 | 대상 변경 |
const int *p or int const *p | 가리키는 값은 못 바꿈, 대상은 바꿈 | ❌ | ✅ |
int *const p | 가리키는 대상은 못 바꿈, 값은 바꿈 | ✅ | ❌ |
const int *const p | 값도 못 바꿈, 대상도 못 바꿈 | ❌ | ❌ |