[C&C++] const 키워드
2023. 4. 25. 19:33ㆍC++
const는 변수를 상수화시켜주는 키워드이다.
(msdn왈, const 변수의 값이 상수임을 지정하고 프로그래머가 수정하지 못하도록 컴파일러에 지시하는 키워드)
그렇다면, const 변수가 선언된 메모리를 참조해서 값을 바꾸면 어떻게 될까?
int main()
{
const int a = 5; //a const로 선언
int b = 4; //b 변수 선언
int* c = &b;
c= c-2; //포인터 c로 a의 메모리 영역을 가리키게 한다.
*c = 2; //a의 메모리 공간을 2로 바꾼다.
printf("%d\n", a); //a값을 출력한다.
printf("%d\n", *c); //c 포인터가 가리키는 값을 출력한다.
return 0;
}
이 코드를 실행하면, 실제로 메모리 공간이 바뀐다.
그러나, 컴파일러에서 a를 상수 5로 처리하기 때문에, a의 값은 그대로 5로 처리된다.
00C2108D mov dword ptr [ebp-4],eax
const int a = 5;
00C21090 mov dword ptr [a],5
int b = 4;
00C21097 mov dword ptr [b],4
int* c = &b;
00C2109E lea eax,[b]
00C210A1 mov dword ptr [c],eax
c= c-2;
00C210A4 mov ecx,dword ptr [c]
00C210A7 sub ecx,8
00C210AA mov dword ptr [c],ecx
*c = 2;
00C210AD mov edx,dword ptr [c]
00C210B0 mov dword ptr [edx],2
printf("%d\n", a);
00C210B6 push 5 //a의 메모리 공간에서 불러오지 않고, 상수로 처리한다.
00C210B8 push 0C22100h
00C210BD call printf (0C21040h)
00C210C2 add esp,8
printf("%d\n", *c);
00C210C5 mov eax,dword ptr [c]
00C210C8 mov ecx,dword ptr [eax]
00C210CA push ecx
00C210CB push 0C22104h
00C210D0 call printf (0C21040h)
00C210D5 add esp,8
return 0;
00C210D8 xor eax,eax
실제로 a 변수를 출력시 5가, c 포인터가 가리키는 메모리공간은 변경된 2로 출력된다.

const int * ptr과 int * const ptr의 차이 :
*ptr을 상수화 시키느냐, ptr을 상수화 시키느냐의 차이이다.
'C++' 카테고리의 다른 글
[C/C++] 라이브러리 (0) | 2023.05.10 |
---|---|
[C++] 모던 C++(C++11) 기초 (1) | 2023.05.09 |
[C/C++] 소켓 API (0) | 2023.04.06 |
[C++] 템플릿 (0) | 2022.01.07 |
[C++] 형 변환 연산 (0) | 2022.01.07 |