Programming Language/C/C++

[C/C++] 포인터와 const

깐요 2017. 5. 10. 17:20

포인터에 const를 사용해?

const라는 키워드는 포인터에 두 가지 방법으로 사용된다

첫 번째 방법은 상수 객체를 지시하는 포인터를 만드는 것이다

상수 객체를 지시하는 포인터를 사용하여 그 포인터가 지시하는 값을 변경할 수 없다

두 번째 방법은 포인터 자신을 상수로 만드는 것이다

상수 포인터를 사용하여 그 포인터가 지시하는 장소를 변경할 수 없다


상수 객체를 지시하는 포인터

int age = 39;
const int *pt = &age;
 
pt += 1;               //pt는 const int를 지시하고 있으므로 사용할 수 없다
cin >> *pt;            //사용할 수 없다
 
*pt = 20;              //pt는 const int를 지시하고 있으므로 사용할 수 없다
age = 20;              //age는 const로 선언되지 않았기 때문에 사용할 수 있다

포인터 pt가 const int를 지시하고 있다

*pt가 const이므로 이를 이용하여 값을 변경할 수 없다

하지만 pt가 지시하고 있는 값이 실제로 상수라는 의미는 아니다

age는 const가 아니기 때문에 값을 변경할 수 있다

그러나 pt를 사용해서는 age의 값을 변경할 수 없다


그렇다면 const 변수의 주소를 const를 지시하는 포인터와 일반 포인터에 대입하면 어떨까

const float g_earth = 9.80;
const float *pe = &g_earth;    //사용할 수 있다
 
const float g_moon = 1.63;
float *pm = &g_moon;           //사용할 수 없다

아래의 경우는 불가능하다

만약 g_moon의 주소를 pm에 대입할 수 있다면 pm을 사용하여 g_moon의 값을 변경할 수 있게 되므로 g_moon이 const라는 것이 무의미해진다


const int months[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
 
int sum(int arr[], int n);    //const int arr[]이어야 한다
...
int j = sum(months, 12);

상수 배열의 주소를 대입할 수 없도록 금지하는 것은, 상수가 아닌 형식 매개변수를 사용하여 배열의 이름을 전달 인자로 함수에 전달할 수 없다는 것을 의미한다

위와 같은 상황이 일어나지 않도록 주의해야 한다


int age = 39;
const int *pt = &age;
 
int sage = 80;
pt = &sage;            //다른 장소를 지시할 수 있다

지시하는 값을 변경할 수는 없지만 새로운 주소를 대입할 수는 있다


const 포인터

새로운 주소를 대입할 수 없도록, 즉 포인터 자신의 값을 변경하지 못하게 만드는 방법이 있다

int sloth = 3;
const int *ps = &sloth;      //const int를 지시하는 포인터
int *const finger = &sloth;  //int를 지시하는 const 

const의 위치자 포인터 이름의 바로 앞에 오면 const 포인터가 된다

이러한 형태의 선언은 finger가 sloth만을 지시하도록 제한한다

finger를 이용하여 sloth의 값은 변경할 수는 있다

finger와 *ps는 const이고, *finger와 ps는 const가 아니다


const 객체를 지시하는 const 포인터를 선언할 수도 있다

double trouble = 2.0E30;
const double *const stick = &trouble;

여기서 stick은 trouble만을 가리킬 수 있고, stick을 사용하여 trouble의 값을 변경할 수 없다

stick과 *stick이 모두 const이다


320x100