const는 *(에스크리터) 기준으로 어디에 설정되어있냐에 따라 상수화되는 부분이 다르다.
(const 키워드는 바로 뒤에 있는 것을 상수화 시킨다.)
예)
int a = 10;
int b = 20;
int* ptr = &a;
*ptr = 999;
ptr = &b;
#1 const가 *(에스크리터) 앞에 붙는 경우 역참조를 통한 값 변경이 불가능하다.
하지만, 참조하고 있는 주소 값은 변경이 가능하다.
int a = 10;
int b = 20;
const int* ptr = &a;
*ptr = 999;
ptr = &b;
#2 const가 *(에스크리터) 뒤에 붙는 경우 역참조를 통한 값 변경은 가능하다.
하지만, 참조하고 있는 주소 값은 변경이 불가능하다.
int a = 10;
int b = 20;
int* const ptr = &a;
*ptr = 999;
ptr = &b;
포인터는 변수다
-> 포인터를 선언하면 메모리에 할당이 된다.
-> 포인터 변수도 할당된 주소를 가진다.
-> 이 주소를 저장할 수 있는 것은 이중 포인터이다.
에스크리터와 역참조 연산자는 1:1의 비율로 작동한다.
포인터 변수에 사용한 역참조는 포인터 변수 선언 시 추가한 에스크리터를 하나 제거한다.
만약, int* ptr2 = &ptr;이 가능하다면
ptr2에 역참조 연산자를 사용하면 int형의 데이터가 나와야 하는데, 나오는 결과는 int* 형의 데이터가 나온다.
따라서 int* ptr2 = &ptr; 은 불가능 하다고 할 수 있다.
이중 포인터
int** ptr2 = &ptr;
int a = 10;
int* ptr = &a;
int** ptr2 = &ptr;
cout << "&a: " << &a << endl;
cout << "*ptr: " << *ptr << endl;
cout << "&ptr: " << &ptr << endl;
cout << "ptr2: " << ptr2 << endl;
cout << "*ptr2: " << *ptr2 << endl;
cout << "**ptr2: " << **ptr2 << endl;
int**
-> ptr의 주소 값
int*
-> a의 주소 값
int
-> a의 정수 값
'Programming > C++ Basic' 카테고리의 다른 글
C++ 2차원 배열 (0) | 2020.08.28 |
---|---|
C++ 배열과 포인터 (0) | 2020.08.28 |
C++ 포인터 (0) | 2020.08.26 |
C++ 재귀 함수 (0) | 2020.08.25 |
C++ 함수 오버로딩, 디폴트 매개 변수 (0) | 2020.08.25 |