[C&C++] const 키워드

2023. 4. 25. 19:33C&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/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