C++ Chapter 6.12 : 포인터와 const

Date:     Updated:

카테고리:

태그:

인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 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값 수정도 안됨.



🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

댓글남기기