본문 바로가기
C │ C++ │ C#/C++

C++ Chapter 6.12 : 포인터와 const

by Pokaa 2023. 11. 19.
728x90
728x90
SMALL
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값 수정도 안됨.

728x90
300x250
LIST