본문 바로가기
컴퓨터/C++_STL

const pointer

by adnoctum 2011. 11. 23.

   const pointer 는 선언에 따라 여러 의미를 갖는다.

const type * variable_name
type* const variable_name
const type * const variable_name

3 가지 방법의 선언을 생각해 볼 수 있는데, 마지막 선언은 예상할 수 있듯이 앞의 두 조건을 모두 유지되는 선언 방법이다. 우선 첫 번째 선언

const type * variable_name

은 pointing 되고 있는 값을 변경시킬 수 없다. 즉, variable_name 의 값을 변경시킬 수 없다, pointer 임에도 불구하고! 따라서 *variable_name = some_value; 라고 하면 = 에 의한 값의 변경이 일어나야 하는데 그렇게 될 수 없는 것이다. 두 번째 선언, 즉,

type * const variable_name

은 pointing 의 '위치'를 바꿀 수 없다. 즉, 포인터 값을 다른 변수의 주소로 변경시킬 수 없다. 대신, 가리키는 변수의 '값'은 변경이 가능하다, 첫 번째 선언 방법에서는 불가능했던.

세 번째 선언은 포인터가 가리키는 변수도, 그리고 그 변수의 값도 모두 변경할 수 없다. 그림으로 보자면 다음과 같다.





모든 변수는 주소를 갖고 있고 ('변수'란 특정 물리 영역에 값을 저장할 수 있는 공간이므로 모든 변수는 '주소'를 갖는다)[각주:1], 그 주소를 포인터형 변수(즉, 그 '주소'를 값으로 갖는 변수)에 집어 넣었을 때, 값에 있는 주소값을 고정시키느냐, 아니면 값에 있는 주소값에 해당하는 또다른 변수의 값을 변경시키느냐가 관건.

즉,
const int *a = &b;

라고 하면 b의 값을 *a = 1; 처럼 해서 바꿀 수 없다. 반면,

int * const a = &b;

로 하면 *a = -1; 로 b의 값을 바꿀 수 있지만 a = &c; 처럼 a가 가리키는 주소의 위치를 바꿀 수 없게 된다.



informal 하게, ㅋㅋ.

위의 방법은 언어를 만들 때 저렇게 된 것이기 때문에 쉽게 이해하기 위한 방법이 존재하지 않는 듯이 보인다. 이런저런 책에서 어떻게 저 둘을 구분할 것인가를 얘기하지만 지금까지 납득이 될만한 것을 보지는 못했다. 그냥, 외우던가 익숙해 지던가, 둘 중 하나이다.






  1. C/C++ 에서 포인터를 어려워하는 가장 큰 이유는 이것을 모르기 때문인 것 같다. 모든 변수는 그 자체의 주소값과 그 주소값에 해당하는 물리적 공간에 저장된 값, 두 값을 갖고 있다. type 이란 그 값을 어떻게 이해할 것인가를 지정한다. [본문으로]

'컴퓨터 > C++_STL' 카테고리의 다른 글

포인터에 대한 짤막한 이야기  (2) 2014.04.02
파일 읽기 편하게 하기  (0) 2013.05.01
isnan과 isinf  (0) 2010.12.06
동적 라이브러리 만들고 사용하기  (5) 2010.05.25
Strict weak ordering  (4) 2010.05.11