조금 더 쉽게 생각 할려면.
포인터 선언의 * 기준으로 수평선을 그려서... const가 왼쪽에 있다면 포인터로 가리켜 지는 것이 상수이고
( const int *a 든 int const * a 든 서로 같다.) -> 1번
오른쪽에 있다면 포인터 자체가 상수이다. -> 2번
둘다 있다면 둘다 상수이다. -> 3번
포인터 선언할 때, const의 위치에 따라서 다양한 종류가 나올 수 있습니다.
1. const int *cip (또는 int const *ip) 2. int * const icp 3. const int * const cicp (또는 int const * const ip)
첫번째는 const int를 가리키는 포인터 ip입니다. 즉 const qualified int (값을 바꿀 수 없는 정수 타입)을 가리키는 포인터입니다. 이 포인터는 얼마든지 다른 const int를 가리키도록 바꿀 수 있지만, 가리키고 있는 대상의 값을 바꿀 수는 없습니다.
const int ci1 = 4, ci2 = 8; const int *cip = &ci1; cip = &ci2; /* ok */ *cip = 0; /* wrong */
두번째는 일반 정수 타입 int를 가리키는 const 포인터입니다. 즉, 가리키는 대상이 int이기 때문에, 얼마든지 값을 변경할 수 있지만, 포인터 자체가 const이기 때문에 다른 int를 가리키도록 바꿀 수 없습니다.
int i1 = 4, i2 = 8; int * const icp = &i1; icp = &i2; /* wrong */ *icp = 0; /* ok */
세번째는 const int를 가리키는 const 포인터입니다. 따라서 다른 대상을 가리키도록 포인터를 바꿀 수도 없고, 대상이 가지고 있는 값을 바꿀 수도 없습니다.
const int ci1 = 3, ci2 = 4; const int * const cicp = &ci1; cicp = &ci2; /* wrong */ *cicp = 0; /* wrong */
참고: ISO C 표준 Sec. 6.7.3.5