본문 바로가기
컴퓨터 공학/C, C++

[ C ] 포인터 이해하기5_값과 주소를 보호하는 const/const 읽는 방법

by hahehohoo 2020. 7. 19.
반응형

값과 주소를 보호하는 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언어 문법 총정리

목록 보러가기 

-----------------------------------

 

 

 

 

 

 


더보기

정리

 

 

 

반응형


댓글