OFFICE/프로그램

Const 키워드에 대한 이해.

gandus 2011. 8. 10. 15:21

조금 더 쉽게 생각 할려면.
 포인터 선언의 * 기준으로 수평선을 그려서...  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