반응형
일반적으로 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 |
댓글