값과 주소를 보호하는 const/const 읽는 방법
변수를 상수화하는 방법 중 하나는 const 선언입니다
포인터 변수에도 똑같이 적용할 수 있습니다.
하지만 포인터의 const는 매우 헷갈립니다.
이유는 const로 값과 주소, 두 개를 보호할 수 있기 때문인데요.
키워드 선언 위치에 따라 보호할 대상과 읽는 방법이 달라지니 주의하셔야 합니다.
그럼 먼저 const로 보호할 수 있는 대상을 하나씩 보겠습니다.
1. 주소를 보호하는 const 포인터
기본 자료형 변수에 const를 붙이면 그 변수에 저장한 값을 변경할 수 없습니다.
그럼 포인터 변수에 const를 붙이면 무엇이 바뀌지 말아야 할까요?
포인터 변수에 저장되어 있는 것은? 메모리 주소
즉, const 포인터는 메모리 주소를 바꿀 수 없습니다.
선언은 const int * a; 가 아니라
int* const p = #
로 해야합니다. 조금 색다르죠?! 읽는 것도 오른쪽에서 왼쪽으로 읽어야 합니다.
p는 컨스트 포인터 투 인트
// int* const 변수
int* const p = #
p = &score; /* 컴팡일 오류*/
int* q = p;
*p = 1024;
2. 값을 보호하는 const를 가리키는 포인터
const를 가리키는 포인터는 값을 보호합니다.
이 경우에는 생성과 동시에 초기화해야 하고, 후에 다른 값으로 변경할 수 없습니다.
// const int 변수
const int score = 100;
score = 0; /* 컴파일 오류 */
int x_score = score; /* const가 아닌 변수에 대입은 가능 */
선언 방법에는 두가지가 있습니다.
const int* p = &num1; // 방법1
int const * p = &num1; // 방법2
실수가 있을 경우 함수 내에서 뿐만 아니라 전역적으로 문제가 발생
이게 바로 전의 경우(주소 보호)보다 더 중요
이 const는 반드시 신경써야 함
그 주소에 저장되어 있는 값을 변경하는 것을 방지
역시 오른쪽에서 왼쪽으로 읽으면 되는데 영어로는 아래와 같이 읽으면 됩니다.
방법1 p is a pointer to int, whch is const
방법2 p is a pointer to const int
흔히 방법2보다는 방법1을 많이 사용합니다.
아마 포인터가 아닌 int를 const로 만들 때, const int라고 하므로 비슷하게 보이는 방법 1을 더 많이 쓰는 것 같습니다.
3. 주소와 값 모두 지키는 const
두 const 합체 버전도 있습니다.
const int* const p = #
역시 오른쪽에서 왼쪽 읽으면 됩니다.
p is a const pointer to const int
초기화된 후 절대 바뀌지 않는 변수가 있을 때 사용할 수 있습니다.
예) 전역 변수, 구조체 멤버 변수
-----------------------------------
-----------------------------------
정리
'컴퓨터 공학 > C, C++' 카테고리의 다른 글
[ C ] 포인터 이해하기7_함수 포인터란? 함수를 포인터에 저장할 수 있을까? (987) | 2020.07.20 |
---|---|
[ C ] 포인터 이해하기6_void 포인터 개념 / 활용도 (411) | 2020.07.19 |
[ C ] 포인터 이해하기4_값에 의한 전달 vs 참조에 의한 전달/from 윤성우 or 포프 (389) | 2020.07.18 |
[ C ] 포인터 이해하기3_포인터와 배열의 차이 (400) | 2020.07.18 |
[ C ] 포인터 이해하기2_참조와 역참조/ 역 참조 연산자 * (611) | 2020.07.18 |
댓글