홍정모의 따라하며 배우는 C++에서 6.13 포인터와 const 정리
1. 포인터
포인터는 값을 저장하는 변수가 아니라 메모리 주소를 저장하는 변수다.
int value = 5;
int *ptr = &value;
// 메모리 주소 출력
cout << ptr << endl;
// 메모리 주소에 저장된 값을 출력
cout << *ptr << endl;
2. const
변수에 const 키워드를 사용하면 해당 변수를 상수처럼 사용할 수 있게 된다. const 키워드가 사용된 변수는 값을 다시 할당할 수 없다.
const int num = 5;
num = 10; // 컴파일 에러 발생
3. 상수 포인터
포인터 역시 변수이기 때문에 const 키워드와 함께 사용이 가능하다.
int value = 5;
// 상수 포인터
const int *ptr = &value;
상수 포인터의 의미는 해당 포인터 변수가 가리키는 메모리 주소에 저장된 값을 상수처럼 취급하겠다는 의미이다. 따라서 상수 포인터로 역참조(dereference)를 해서 값을 변경하는 행위를 할 수 없다.
int value = 5;
const int *ptr = &value;
// 역참조한 값을 사용하는 것은 가능. 5 출력
cout << *ptr << endl;
// 역참조를 통해 값을 변경하는 행위는 불가능. 컴파일 에러 발생
*ptr = 10;
// value는 변수이기 때문에 값을 변경할 수 있음. 10 출력
value = 10;
cout << *ptr << endl;
재미있는 부분은 상수 포인터에서 가리키는 메모리 주소의 값은 변경이 가능하다. 하지만 역참조를 통해 접근할 수 있는 값은 상수처럼 취급하기 때문에 여전히 변경할 수 없다.
int value = 5;
const int *ptr = &value;
int new_value = 10;
ptr = &new_value;
4. 포인터 상수
포인터 상수는 포인터 변수에 저장된 메모리 주소값을 상수처럼 취급하기 위해 사용할 수 있다.
int value = 5;
int *const ptr = &value;
cout << *ptr << endl; // 5
int new_value = 10;
// 컴파일 에러 발생. 포인터 상수에 새로운 주소값을 할당할 수 없음
ptr = *new_value;
*ptr = 10;
cout << *ptr << endl; // 10
포인터 상수는 const 키워드가 붙은 변수처럼 선언과 동시에 초기화를 해야 한다. 또한, 새로운 주소값을 할당할 수는 없지만, 역참조를 통해 접근할 수 있는 값은 상수로 취급하지 않기 때문에 값을 변경할 수 있다.
그래서 메모리 주소값과 주소에 저장된 값을 모두 상수처럼 취급하고 싶으면 const int *const ptr = &value
와 같은 방식으로 사용해야 한다.
'프로그래밍 언어 > C++' 카테고리의 다른 글
환경설정(vcpkg 설치) (0) | 2023.04.28 |
---|---|
함수 오버로딩과 포인터 (0) | 2023.04.03 |
cin과 getline (0) | 2023.03.25 |
헤더 파일과 소스 파일 나누기 (0) | 2023.03.16 |
LEARN C++ 1.7 (0) | 2023.02.16 |