프로그래밍 언어/C, C++

포인터와 const

chan4 2023. 4. 13. 23:27

상수를 가리키는 포인터 (Pointer to const Value) = const int*

상수를 가리키는 포인터는 상수 변수의 주소를 가리키는 비상수(non-const) 포인터다

const int value = 5;

const int* ptr = &value;

ptr 은 const int를 가리키고, ptr 자체는 비상수(non-const) 포인터이다.

상수를 가리키는 포인터는 상수가 아닌 변수를 가리킬 수 있다.

초기에 const로 정의된 변수만 상수로 취급한다.

int value = 5;
const int* ptr = &value;

value = 6 // 가능!

그러나 다음은 불가능하다.

int value = 5;
const int* ptr = &value;

*ptr = 6; // 불가능!

ptr은 상수를 가리키는 포인터이므로, value를 상수로 취급한다.

따라서 상수를 변경하는 행위는 컴파일 에러로 판단한다.

 

상수 포인터 (Const pointer) = int* const

상수 포인터는 초기화 후에 가리키는 주소를 변경할 수 없는 포인터이다.

int value = 5;

int* const ptr = &value;

상수 포인터도 일반 상수 변수와 마찬가지로 선언 시 초기화해야 한다.

상수 포인터는 항상 같은 주소를 가리킨다!

이 때, 주소만 상수일 뿐, 주소가 가리키는 값은 상수가 아니므로 역참조하여 값을 변경할 수 있다.

int value1 = 5;
int value2 = 10;
int* const ptr = &value;

ptr = &value2; // 이건 불가능

*ptr = 6 // 이건 가능

상수를 가리키는 상수 포인터 (Const pointer to a const value) = const int* const

상수를 가리키는 상수 포인터는 다른 주소를 가리키도록 수정할 수 없으며, 역참조를 통해 값을 수정할 수도 없다.