1. 문제 개요
C와 C++에서는 const
키워드와 포인터를 조합하여 다양한 읽기 및 쓰기 제한을 설정할 수 있습니다. const int*
, int* const
, 그리고 int const* const
는 자주 혼동되지만, 실제로는 엄격한 규칙에 따라 동작합니다. 본 글에서는 이를 명확히 이해하고 올바르게 사용하는 방법을 알아봅니다.
2. const
와 포인터의 기본 규칙
포인터 선언에서 const
키워드는 읽기 제한을 설정합니다. 다음은 선언을 읽는 기본 규칙입니다:
- 가장 가까운
const
가 무엇을 제한하는지 확인합니다. - 선언을 오른쪽에서 왼쪽으로 읽는 방식이 이해에 유용합니다.
기본 형태와 의미
선언 | 의미 |
---|---|
int* ptr |
ptr 는 정수를 가리키는 포인터입니다. |
const int* ptr |
ptr 는 상수 정수를 가리키는 포인터입니다. |
int* const ptr |
ptr 는 수정할 수 없는 포인터입니다. |
const int* const ptr |
ptr 는 상수 정수를 가리키는 수정할 수 없는 포인터입니다. |
3. 주요 선언 사례와 동작 원리
3.1 const int* ptr
- 의미: 포인터가 가리키는 값은 수정할 수 없지만, 포인터 자체는 다른 값을 가리킬 수 있습니다.
- 예제:
int a = 10, b = 20;
const int* ptr = &a;
*ptr = 15; // 오류: 가리키는 값을 수정할 수 없음
ptr = &b; // 허용: 포인터가 다른 값을 가리킬 수 있음
3.2 int* const ptr
- 의미: 포인터 자체는 수정할 수 없지만, 가리키는 값은 수정할 수 있습니다.
- 예제:
int a = 10, b = 20;
int* const ptr = &a;
*ptr = 15; // 허용: 가리키는 값을 수정할 수 있음
ptr = &b; // 오류: 포인터 자체를 수정할 수 없음
3.3 const int* const ptr
- 의미: 포인터 자체도 수정할 수 없고, 가리키는 값도 수정할 수 없습니다.
- 예제:
int a = 10;
const int* const ptr = &a;
*ptr = 15; // 오류: 가리키는 값을 수정할 수 없음
ptr = &b; // 오류: 포인터 자체를 수정할 수 없음
4. 이미지로 개념 이해하기
아래 이미지는 const
와 포인터 선언의 관계를 명확히 보여줍니다:
이미지를 통해 각 선언의 역할과 제한을 직관적으로 파악할 수 있습니다:
- 화살표가 가리키는 방향에 따라 어떤 부분이 제한되는지 명확히 확인 가능합니다.
const
의 위치가 포인터와 가리키는 값에 미치는 영향을 시각적으로 이해할 수 있습니다.
5. 요약
const
는 포인터 선언에서 읽기 제한을 설정하며, 포인터 자체와 가리키는 값에 각각 적용될 수 있습니다.- 선언을 읽을 때는 오른쪽에서 왼쪽으로 읽는 규칙을 사용하면 명확히 이해할 수 있습니다.
- 위에서 설명한 원칙과 이미지를 활용하면 복잡한 선언도 쉽게 해석할 수 있습니다.
이제 const
와 포인터 조합에 자신감을 가지고 코드를 작성해 보세요!