일반적으로 우리가 보통 사용한다면 왼쪽과 같이 사용한다. 하지만 오른쪽 처럼 const를 사용한 변수에다가 const를 사용하지 않고 assign을 한다면 compile error가 발생한다. 보통 포인터 변수는 주소값을 바꿀 수가 있기 때문에, const로 사용한 변수를 문제 없이 받을려면 const를 사용하여 받아야 한다. 즉, 아래의 그림과 같이 바꿔야 한다. 여기서 *ptr
에서 error가 나는 것을 볼 수 있는데, *ptr은 D-referencing을 못하고 있는 것이다. 그 이유는 모든 것이 const로 선언하였는데, 값을 바꾼다는 것이 말이 안되니 말이다. 하지만 출력은 할 수 있다.
여기가 살짝 헷갈릴 수가 있는데, 그림에서 int value1 = 5; const int *ptr = &value1;
은 이해가 될 것이다. 근데 int value2 = 6
을 작성하고 이 ptr = &value2
는 도대체 무엇인지 이게 되는 것인지 헷갈리기 시작한다.
일반적으로 우리가 const int *ptr
과 같이 선언을 하게 되면, ptr의 주소를 못바꾸게 하는 것이 아니라 ptr에 들어가는 값을 못바꾸게 하는 것과 같다. 그렇기 때문에, 위의 코드는 문제없이 돌아간다. ptr에다가 변경된 주소값을 넣는 것이니 말이다. 하지만 여기서 값을 넣게 된다면, compile error가 발생한다. 그림을 보고 실제로 코드를 작성하며 이해해 보도록 한다.
이것도 신기하다. int *const ptr = &value;
로 작성하는 것이 포인터를 const로 바꾸는 것이다. 즉 어떤 값에 대한 주소를 갖고 있는 ptr의 주소를 절대 바꿀 수 없게 선언하는 것이다.
보는 바와 같이 값을 바꿔 넣는 것에 대해 제대로 출력하지만 주소값을 ptr
에 넣으면 compile error가 발생한다.
이와 같이 선언하면 값을 바꿀수도 없다.