본문 바로가기
C++/기초

C++ 기초 : const 포인터

글: 시플마 2024. 3. 31.

포인터 변수에도 const 키워드를 붙여 

상수화할 수 있습니다.

 

이 경우 두 가지 상황이 발생하는데요.

 

어떤 포인터 변수가 변수 a의 주소를 저장하고 있습니다.

 

이때 const를 통해 포인터 변수가 저장하고 있는 변수를

상수화하거나, 포인터 변수 자체를 상수화할 수 있습니다.

 

 

예를 들어 보죠.

 

포인터 변수 pInt는 변수 a의 주솟값을 저장하고 있습니다.

 

pInt를 통해 변수 a의 값을 직접 변경하려고 하니 오류가 발생합니다.

식이 lvalue여야 한다고 합니다. 이는 a가 rvalue로 인식되어

수정할 수 없는 상태가 되었다는 것입니다.

 

포인터 변수가 저장하고 있는 변수를 상수화한 상황이죠.

 

 

이번에는 또 다른 상황을 봅시다.

 

13번째 줄부터 새로운 코드를 추가했습니다.

 

포인터 변수 pInt2를 선언하고 변수 b의 주솟값을 저장하였습니다.

 

pInt2에 변수 a의 주솟값을 저장하려고 하니 오류가 발생하네요.

이 경우, 포인터 변수 자체를 상수화한 상황이죠.

 

 

포인터 변수에서 *을 기준으로 const가 앞에 붙느냐 

뒤에 붙느냐에 따라 상수화되는 변수가 달라집니다.

 

근데 이것을 그냥 암기하려고 하면 잊기 십상인데요.

 

위 그림처럼 const가 어떤 것을 수식하는지 생각해 보면 

암기하기 쉽습니다.

 

첫 번째 경우 : const 키워드가 포인터를 수식한다고 생각한다.

포인터는 어떤 변수의 주솟값을 저장하고 있다.

즉 기리키고 있는 그 변수를 상수화!

그러므로 해당 포인터를 통해 변수의 값을 바꿀 수 없다.

 

두 번째 경우 : const 키워드가 포인터 자체(포인터명)를 수식한다고 생각한다.

즉 포인터 변수 자체를 상수화!

그러므로 해당 포인터에 다른 변수의 주솟값을 저장할 수 없다.

 

 


 

 

 

그럼 아래와 같은 상황은 무엇일까요?

 

const가 포인터 앞에도, 포인터명 앞에도 있습니다.

 

이 경우 포인터 변수 pInt를 통해 가리키고 있는 변수의 값을

수정할 수 없으며, pInt를 통해 다른 변수를 가리킬 수도 없는 상황입니다.

즉 변수 a의 값을 수정할 수도, pInt에 다른 주솟값을 넣을 수도 없는 것이죠.

 

 


 

 

 

여기서 주의할 점이 있습니다.

 

아래 코드를 보시면

 

9번째 줄에 주석이 있습니다.

이 주석을 지우면 오류가 발생할까요?

 

그렇지 않습니다.

 

위 코드에서 const가 포인터를 수식합니다.

즉 가리키고 있는 변수 a를 상수화하였습니다. 

그러나 이는 변수 a를 직접 상수화한 것이 아닙니다.

 

const를 붙임으로써 포인터 변수 pInt를 통해

변수 a의 값을 수정할 수 없도록 상수화시킨 것일 뿐,

변수 a를 직접 상수화한 것이 아닙니다.

 

포인터 변수 pInt 활동에 제약을 건 것이죠.

 

그러므로 pInt를 통한 것이 아니라면

변수 a의 값은 얼마든지 수정할 수 있습니다.

 

 

 

 

강의 출처 : https://www.youtube.com/watch?v=PFc4g8mxOiI&list=PL4SIC1d_ab-aOxWPucn31NHkQvNPHK1D1&pp=iAQB


'C++ > 기초' 카테고리의 다른 글

C++ 기초 : void  (0) 2024.03.31
C++ 기초 : const 포인터 예시  (0) 2024.03.31
C++ 기초 : const  (0) 2024.03.30
C++ 기초 : 포인터 문제 풀이와 해답  (0) 2024.03.30
C++ 기초 : 포인터 배열  (0) 2024.03.30