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

+ Recent posts