값이 바뀌지 않는 데이터
const int cInt = 100;
// 상수화
// r-value
// 10, 122 과 같은 수
// const 키워드로 선언된 변수
cInt;
int ii = 10;
const int cInt = 100;
cInt = 500; 이것과 같은 행위는 문법적으로 방지 // 문제의 소지가 있지만 상황 예시를 위함.
const int cInt = 100;
int* pInt = (int*)&cInt;
*pInt = 300;
printf("cInt 출력 : %d", cInt); // 100 vs 300
예외 volatile 키워드
volatile const int cInt = 100;
int* pInt = (int*)&cInt;
*pInt = 300;
printf("cInt 출력 : %d", cInt); // 300
volatile : 휘발성.
const가 붙어 상수처럼 쓸 순 있으나,
값을 바꾸지 못하는 것은 아님. (절대적이진 X)
const int i = 100;
int a = 0;
int* pInt = &a;
a 수정*pInt = 1;pInt = nullptr;const 포인터
int a = 0;
const int* pConstInt = &a;
*pConstInt = 100; // 불가능. 문법 오류. lvalue(: 값이 바뀔 수 있는 변수)가 아니라 수정 불가
int b = 0;
pConstInt = &b; // 가능
포인터 const
int a = 0;
int* const pIntConst = &a;
*pIntConst = 100; // 가능
int b = 0;
pIntConst = &b; // 불가능
pIntConst는 a만을 가리키는 포인터가 됨.const int* const pConstIntConst = nullptr;
두 사용법이 형태가 유사하다보니 나중에 헷갈리기 쉬움
암기법 : 수식어 위치. const는 항상 뒷 단어를 수식한다.
const 포인터 [변수명]=> const는 포인터가 가리키는 값을 상수화. (원본 상수화)포인터 const [변수명]=> const는 변수를 수식. 포인터 변수가 상수화. (포인터 변수 상수화)
int const* p = &a;
// 이 경우 const는 *을 수식... 즉, 원본 상수화에 해당함.
int a = 0;
const int* pInt = &a; // 원본 상수화
a = 100; // 가능할까? 가능
int* p = &a;
*p = 100; // 가능할까? 가능
pInt를 통해서 접근했을 때, 값을 바꿀 수 없는것a, 다른 포인터 변수p를 통한 변경은 여전히 가능함.pInt 포인터의 기능을 제한한 것.void Output(const something* pI)
{
// 원본 상수화
*pI; // 접근 가능
*pI = value; // 수정 불가
}
int main()
{
something a = ~~;
Output(&a);
return 0;
}
ctrl + shift + space즉, const 포인터를 쓰는 이유는 주소값을 받을 때
수정하진 않고 읽기용으로 쓰겠다고 알려주기 위해서 사용하는 것.