본문 바로가기
Programming/C++

C/C++ 에서 변수 선언자의 위치에 따른 차이

by 작은별하나 2014. 3. 11.
반응형

일반적으로 C/C++ 프로그램을 짜다 보면, const, *, &, volatile 등 변수 타입에 붙는 많은 형태를 쓰게 됩니다. 그런데 많이들 헷갈려하시는 것이 변수 타입에 붙는 수식어가 어떤 영향이 있는가입니다.


여기에 간단한 프로그램을 소개합니다.

#include <stdio.h>

void main()
{
	int a = 10, b = 5;
	const int *p1 = &a;
	int * const p2 = &a;

	printf("a = %d, *p1 = %d, *p2 = %d\n", a, *p1, *p2);
//	*p1 = 3;		//	p1이 const int의 포인터이므로 변수에 값 저장 불가
//	printf("a = %d, *p1 = %d, *p2 = %d\n", a, *p1, *p2);
	*p2 = 4;
	printf("a = %d, *p1 = %d, *p2 = %d\n", a, *p1, *p2);
	p1 = &b;
	printf("a = %d, *p1 = %d, *p2 = %d\n", a, *p1, *p2);
//	p2 = &b;	//	p2는 int * 의 const 변수이므로 값 저장 불가
//	printf("a = %d, *p1 = %d, *p2 = %d\n", a, *p1, *p2);

}

위 프로그램에서 보면, const 위치에 따라서 컴파일러에서 허용하는 것들이 달라집니다.


const int *p1 이라고 선언되어 있다면, 다음과 같이 괄호를 넣어서 생각하셔야 합니다. (const int) *p1 으로 말입니다. 이것은 상수형 int 의 포인터 변수 p1이라는 의미입니다.

그렇기 때문에 p1 = &b 은 허용되지만, *p1 = 10 과 같이 포인터가 가르키는 저장공간의 값을 바꾸는 것은 허용되지 않습니다. (여기서 허용되지 않는다는 것은 문법적인 요소입니다. 실제 CPU는 const가 붙어있다는 사실을 전혀 모릅니다. 즉 컴파일러가 허용하지 않는다는 의미입니다.)


int * const p2 라고 선언되어 있다면, 이 경우에는 int 포인터의 상수 변수 p2 라는 의미입니다. 이 경우에는 p2라는 변수가 const로 보호되므로 p2 = &b 와 같이 p2 변수의 내용을 바꾸는 것은 불가능합니다.


변수 타입을 수식하는 연산자나 한정자는 위치에 민감하니 꼭 주의해서 쓰셔야 합니다.

728x90

'Programming > C++' 카테고리의 다른 글

초성 표시하기  (0) 2014.12.26
마크로를 이용해서 문자열 찍기  (0) 2014.12.02
문자열 처리  (0) 2014.09.26
C++로 문자열 입력받아서 출력 변환하기..  (2) 2014.09.24
로또 번호 생성 및 짝맞추기  (0) 2014.05.05

댓글