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
'C │ C++ │ C# > C++' 카테고리의 다른 글
C++ Chapter 6.14 : 참조와 const (1) | 2024.01.21 |
---|---|
C++ Chapter 6.13 : 참조 변수 (0) | 2024.01.15 |
C++ Chapter 6.11 : 동적 할당 배열 (1) | 2023.11.12 |
C++ Chapter 6.10 : 메모리 동적 할당 new와 delete (0) | 2023.11.05 |
C++ Chapter 6.9 : C언어 스타일의 문자열 기호적 상수 (1) | 2023.10.29 |