Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

zyeon's 작심삼일 코딩 공부

const와 포인터 본문

c++ 정리

const와 포인터

젼뀨 2024. 6. 21. 15:23

const

변수를 상수화 하는 것을 기호 상수라고 한다. 변수 앞에 const를 붙이면 상수화 되며, 변수 선언 시 반드시 초기화 해주어야 한다. 이후에 다른 값을 대입할 수 없지만, 예외로 클래스 생성자 호출 시에는 한 번 초기화 할 수 있다.

const double TAX_RATE = 0.33;         //상수화
int income = 300000;
income = income - TAX_RATE * income;

 

위 코드에서는 TAX_RATE를 상수화 하였다.

 

그렇다면 왜 상수 값을 그대로 사용하지 않고, 기호 상수를 사용하는 이유는 무엇일까?

우선, 기호 상수를 사용하면 코드를 작성한 사람의 의도를 읽기 쉬워지며 가독성이 좋아진다. 

또한 동일한 상수를 여러 곳에서 사용하고 있을 때, 상수 값을 일일이 바꿔 줄 필요가 없고 값 변경이 쉬워진다.


const와 포인터

만약 상수 변수를 포인터로 강제 접근해 값을 변경하려 한다면 어떻게 될까?

int *p = nullptr;
const int i = 10;

p = (int*)&i; //&i는 const int* 타입으로 취급됨
*p = 20;      //주소로 접근해 i의 값 변경

이처럼 포인터를 사용해 주소로 접근을 하면 오류를 출력하지 않고 상수 변수의 값을 변경할 수 있다.

하지만 실제로 값을 출력해보면 i의 값은 10으로 동일하다.

이는 컴파일 과정에서 상수 변수는 문법적으로 값을 변경할 일이 없다고 인식하기 때문에 최적화를 위해 레지스터에 있는 값을 불러오기 때문이다.

volatile const int i = 10;

작성했던 코드의 2번째 줄을 위와 같이 선언하면 i값은 20으로 정상 출력된다.

volatile 키워드는 컴파일러에게 이 변수의 값이 언제든 변경 될 수 있음을 알려 변수에 접근할 때마다 메모리에서 값을 다시 읽게 하게한다. 따라서 최적화가 이루어지지 않는다.

 

이런 코드들은 const 사용 의의와 동떨어져있으니 사용하지 않는게 좋다.


const 키워드와 포인터를 같이 사용할 때 const의 위치에 따라 해석이 다르다.

 

상수 포인터

int a = 10;
int b = 20;
const int *p = &a;

//*p = 50; 불가능
p = &b;  //가능

const 키워드가 *연산자 좌측에 있으면 포인터가 가리키는 주소의 원본 값을 변경할 수 없게 된다. 

 

상수에 대한 포인터

int a = 10;
int b = 20;
int *const p = &a;

*p = 50; //가능
//p = &b;  불가능

const 키워드가 *연산자 우측에 있으면 포인터가 가리키는 주소값이 상수화 된다.

 

상수에 대한 상수 포인터

const int *const p = nullptr;

주소와 값 모두 상수화 되어 변경 할 수 없다.

'c++ 정리' 카테고리의 다른 글

문자 자료형 wchar_t  (0) 2024.06.28
void 포인터  (0) 2024.06.21
포인터와 배열  (0) 2024.06.20
포인터  (0) 2024.06.17
지역변수, 전역변수, 정적변수, 외부변수  (2) 2024.06.14