C/C++ 공부하다 보면 반드시 한 번은 헷갈리는 지점이 const와 포인터의 조합이다. 오늘 정리한 내용을 기록해둔다.
포인터가 들고 있는 두 가지
포인터 변수는 메모리 공간을 하나 차지하면서, 그 안에 주소값을 저장하고 있다. 그래서 포인터에는 "고정할 수 있는 대상"이 두 가지 존재한다.
- 포인터가 가리키는 데이터 (주소를 따라갔을 때 나오는 값)
- 포인터 자기 자신이 담고 있는 주소값
const를 어디에 붙이느냐에 따라 이 둘 중 무엇을 고정할지가 갈린다.
int a = 10, b = 20;
const int* p1 = &a; // (1) 가리키는 데이터가 const
int* const p2 = &a; // (2) 포인터 자체가 const
(1) const int* p1 — 가리키는 값을 못 바꾼다
이 포인터를 통해서는 가리키는 대상의 값을 변경할 수 없다. 대신 포인터가 다른 곳을 가리키게 하는 것은 자유롭다.
*p1 = 30; // 에러! 가리키는 값 변경 시도
p1 = &b; // OK! 포인터가 다른 곳을 가리키는 건 자유
(2) int* const p2 — 포인터 자체를 못 바꾼다
가리키는 값은 자유롭게 바꿀 수 있지만, 포인터 변수 자체(담고 있는 주소값)는 바꿀 수 없다.
*p2 = 30; // OK! 가리키는 값 변경은 자유
p2 = &b; // 에러! 포인터 자체(주소값)를 바꾸려 함
즉 p2는 한번 &a로 초기화되면 평생 a만 가리켜야 하는 포인터가 된다. const int x = 10;이라고 선언하면 x에 다른 값을 대입할 수 없는 것과 완전히 같은 원리인데, 다만 p2가 담고 있는 "값"이 다름 아닌 "주소"라는 점이 다르다.
판별하는 팁
const의 위치가 * 기준으로 어디에 있는지를 보면 된다.
- const가 *보다 왼쪽에 있으면 → 가리키는 대상이 const
- const가 *보다 오른쪽(변수 이름 바로 앞)에 있으면 → 포인터 자체가 const
참고로 int const * p3처럼 const가 int 뒤, * 앞에 오는 표기도 있는데, 이 경우도 const가 *보다 왼쪽에 있으므로 (1)과 동일하게 "가리키는 대상이 const"인 케이스다. const int*와 int const*는 완전히 같은 의미다.
'공부' 카테고리의 다른 글
| [C++] STL vector - size/capacity부터 iterator invalidation까지 (0) | 2026.08.02 |
|---|---|
| malloc의 정렬(alignment)과 힙 오버플로우 (0) | 2026.07.11 |
| strlen, strcpy, strcmp / memcpy, memcmp 구현 (0) | 2026.07.11 |
| 스파이럴(달팽이) 배열 구현하기 - 방향배열(dx, dy) 방식 (0) | 2026.07.09 |
| 스파이럴(달팽이) 배열 구현하기 - 경계값(Boundary) 방식 (0) | 2026.07.08 |