포인터와 const

const 키워드는 두 가지 방식으로 포인터에 사용됩니다.

첫 번째는 포인터 자체를 일정하게 만드는 것이고 두 번째는 포인터가 상수 객체를 가리키도록 하는 것입니다.

상수 포인터

먼저 포인터 자체가 상수인 경우를 생각해보자.

int a = 30;
int b = 40;

int* const pt = &a;

pt = &b; //불가능
*pt = 40; //가능

이 경우 int(int*) 유형을 가리키는 포인터 pt 자체는 상수입니다.

즉, 다른 변수의 주소를 할당할 수 없습니다.

따라서 const가 아닌 값 자체를 대입할 수 있다.

상수 값에 대한 포인터

다음은 const 개체에 대한 포인터입니다.

int a = 30; //일반 변수
int b = 40;

const int* pt = &a;   //pt는 const int형을 지시하는 포인터이다.

pt = &b; //가능 *pt = 40; //불가능 a =40; //가능

이 경우 위와 달리 ‘포인터가 가리키는 객체’는 변경할 수 있지만 ‘포인터가 가리키는 객체의 값’은 변경할 수 없습니다.

그러나 이것은 pt로 주어진 a가 실제로는 일정하지 않고 pt를 사용하는 한 일정하다는 것을 의미한다.

물론 변수가 일정하더라도 가리킬 수 있습니다.

const int a = 30; //const
const int* pt = &a;   //가능

이 관계를 살펴보면 알 수 있듯이 const 개체를 단순 포인터로 참조하는 것은 불가능합니다.

const int a = 30; //const
int* pt = &a;   //일반 포인터로 지시 불가능

const인 a의 값은 *pt(간접 참조)에 의해 변경될 수 있으므로 상식적으로라도 이를 방지하는 것이 맞다.

둘다.

즉, 상수를 가리키는 포인터를 상수로 정의하는 것도 가능하다.

const int a = 30; //const
const int* const pt = &a;   //일반 포인터로 지시 불가능

매개변수 포인터 선언

포인터를 함수의 매개변수로 사용할 때 다음과 같은 이유로 const에 대한 포인터로 선언하는 것이 타당하다.

  • 실수로 원본 데이터를 수정하는 것을 방지할 수 있습니다.

  • const를 가리키는 포인터는 일반 객체와 const 객체를 모두 처리할 수 있지만 위에서 본 것처럼 일반 포인터는 const 객체를 처리할 수 없습니다.