포인터 변수에도 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 |