반응형


+ const와 pointer 헛갈림 주의!
pointer(*) vs const pointer( *const )
포인터냐 콘스트 포인터냐?

주소를 보호하는 걸까 데이터를 보호하는 걸까? 
const뒤에 오는 것이 중요! *p면 값 보호, p면 주소 보호.
또는 영어로 코드를 거꾸로 읽으면 간단하다.


1)  값의 보호 ; const 뒤에 *가 있다.   (많이 사용. 값의 보호가 주로 목적)

  • 그냥 포인터임. p is a pointer. p앞에 *가 있다.
const char *p =&xxx;          ====> const 뒤에 *가 있으면 값의 보호다.
char const *p = &xxx ;  (상동!) ==> const 뒤에 *가 있으면 값의 보호다.

변수 p 바로 앞에 *가 있으면 그냥 일반 포인터가 된다. (const pointer가 아니라 일반 포인터일뿐) 
포인터가 가리키는 타입이 const char ; 값 보호.
p is a pointer to  const char/char const(same) ; 코드를 거꾸로 읽으면 이렇게 됨.
*p=1;            // error!!  const로 지정된 값 보호.  값 변경 불가.
p=&yy ;          // ok!  주소가 변경됨.


2) 주소 보호 ; const 뒤에 *가 없음. 앞에 있음. (많이 쓰이지 않음. 선언과 동시에 초기화 필요.)

  • 콘스트 포인터임. const pointer​  (*const). 포인터 보호.
int *const p = &xxx ;     
int *const p ;    ==> 에러! 초기화를 해줘야 한다. 왜? 변경불가이기 때문에...

변수 p 바로 앞에 *가 없으면 앞을 묶어서 타입으로 봐야 한다. *const 이므로 const pointer 가 된다. (일반 포인터가 아니다.)
p is a const pointer(*) to int. ; 코드를 거꾸로 읽으면 이렇게 됨.

*p=1;            // ok 값 변경.
p=&yy ;          // error! 주소변경 불가.


3)  값과 주소 둘 다 보호
const int *const p=&xxx;
p is a const pointer(*) to const int. 
*p = 1 ;     // error
p = &yy;     // error


즉, *가 어디에(변수에? or const에?)  붙었나 살펴보거나, 코드를 뒤에서 부터 읽으면 된다.



+ Recent posts