C++ Chapter 6.12 : 포인터와 const
카테고리: Cpp
태그: Cpp Programming
인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 C++ 강의를 듣고 정리한 필기입니다. 😀
🌜 [홍정모의 따라 하며 배우는 C++]강의 들으러 가기!
const int * ptr : const가 맨 앞에 붙은 경우
const int a = 5; // a 는 상수
int b = 10; // b는 그냥 변수
const int *ptr_a = &a; // a를 가리키는 포인터
const int *ptr_b = &b; // b를 가리키는 포인터
int *ptr_f = &a; // ❌ 안된다.
ptr_a = nullptr; // 가능
- const가 데이터 타입 앞에, 즉 맨 앞에 붙으면 **간접참조**로 값을 수정하는게 불가능하다.
- a 는 const가 붙은 상수이므로 값을 바꿀 수 없다.
- 따라서 간접참조로 인하여 a의 값을 바꾸지 못하도록 a를 가리키는 포인터 ptr_a 또한
const int *
타입으로 선언이 되야 한다. - b는 상수가 아닌 그냥 변수이지만 b를 가리키는 ptr_b 가
const int *
타입으로 선언되었으므로 ptr_b로 b의 값을 바꾸는 것은 불가능하다.cout << *ptr_b << endl; // 10이 출력됨. 이렇게 읽는 것만 가능. *ptr_b = 7; // ❌ 불가능 !
int *ptr_f = &a;
a는 값을 바꿀 수 없는 상수인데 일반 포인터인 ptr_f가 간접참조로 a의 값을 바꿀 우려가 있으므로 일반 포인터는 상수를 가리킬 수 없다. 포인터 또한 const 포인터여야 상수를 가리킬 수 있다.- 간접참조로 값만 못바꾸는 것이지 포인터 자체의 값, 즉 주소값은 바꿀 수 있다.
ptr_a = nullptr;
가능
int a = 3;
int b = 7;
int * ptr1;
const int * ptr2 = &a;
ptr1 = ptr2; // ⚡⚡에러⚡⚡
일반 포인터에 const 포인터를 할당할 수는 없다.
- const int* 타입인 ptr2를 그냥 int* 인 ptr1에 대입할 수 없음.
- a의 주소값을 복사받은 일반 int* 포인터인 ptr1이 a의 값을 간접참조로 바꿀 수도 있기 때문에
char *
타입의 변수에const char *
즉, 문자열 상수를 대입할 수 없는 것도 이와 같은 이유.
int * const ptr : const가 포인터 변수 이름 앞에 붙은 경우
int a = 20;
int * const ptr = &a;
*ptr = 7; // 가능
ptr = &b; // ❌ 불가능
- ptr의 값을 수정할 수 없다.
- 즉 주소값이 상수가 되어 수정 불가능하다.
- 따라서 꼭 선언과 동시에 초기화가 되어야 한다.
- 간접참조 수정은 가능하다.
- 즉 주소값이 상수가 되어 수정 불가능하다.
응용) const int * const ptr
도 가능! 이 경우엔 간접참조 수정도 안되고 ptr값 수정도 안됨.
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글남기기