반응형
+ 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에?) 붙었나 살펴보거나, 코드를 뒤에서 부터 읽으면 된다.
'Develop > C&CPP' 카테고리의 다른 글
벡터 구조체 필드 기준으로 최대값 최소값 찾기 (0) | 2019.05.31 |
---|---|
smart pointer 스마트포인터? (0) | 2018.07.19 |
libcurl HTTP POST send 모듈/curl 커맨드 방식도 지원 (0) | 2018.07.13 |
if or 비교시 어떤 식의 성공으로 진입했는지 구분 (0) | 2018.07.13 |
Numerics library (0) | 2018.06.21 |