포인터에 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이다
'Programming Language > C/C++' 카테고리의 다른 글
[C/C++] ios_base 클래스, setf, fmtflags 출력 형식 지정 (0) | 2017.05.18 |
---|---|
[C/C++] atan2 함수로 각도 구하기 (극 좌표계) (0) | 2017.05.11 |
[C/C++] string 문자열 비교 ==? compare? strcmp? (1) | 2017.04.30 |
[C/C++] error C2872, 모호한 기호입니다 (0) | 2017.04.24 |
[C/C++] error C4996: 'strcpy' 'strcat' 오류 해결 (0) | 2017.04.21 |