const 키워드는 개발중에는 자연스럽게(?)사용하다가, 질문을 받고 설명하려고 하면 은근히 까다롭게 느껴져정리를 하고자 합니다. 개발자마다 설명하는 방법이 여러가지 있을 수 있지만, 저의 경우는 아래 개념으로 이해를 하고 있습니다.
1. const(constant) 키워드란?
- 상수로 만든다, 변경할수 없게 만든다.
- 변수 또는 포인터 변수를 상수로 만든다. --> 변수의 상수화
- const를 사용한 변수는 반드시 초기화 되어야 함(생각해 보면 당연함!)
2. 어디에 위치하는가?
- https://www.geeksforgeeks.org/memory-layout-of-c-program/
- const 키워드를 가진 변수는 반드시 초기화 되어야함
- Data Segment(아래 3가지 형태로 분류)에 저장됨:
1) .DATA 영역: 변수를 초기화한 상태 저장
2) .BSS 영역: 변수를 초기화하지 않은 상태 저장
2) .RODATA 영역 : 읽기 전용 데이타 (예: const char* string="hello")
--> 참고: 세크먼트 분류: CODE(TEXT), DATA, HEAP, STACK)
3. 용례
1) const int 과 int const 는 같은 의미
- 상수 int := int 상수
- const int a; // 에러 발생: const는 반드시 초기화 되어야 함
- cont int a = 10;
a = 11; // 에러발생: 상수화된 변수 내용은 변경 불가
2) const vs 포인터 변수: 4가지 조합이 가능함
- 이 문법은 아차하면 헷갈림
a) const int *pointer: 상수 포인터
- int형 상수에 대한 포인터(pointer to int const)
- 포인터 대상 or 내용을 상수화시킴
- 포인터 변수 주소 변경가능, 포인터 대상/내용 변경 불가
- const int *pointer 해석(?): int가 const이다. 그래서 내용이 변경 불가이고, 포인터 자체는 변경이 가능합
- 예:
int nValue1 = 100;
int nValue2 = 200;
const int *pnVar1 = &nValue1;
pnVar1 = &nValue2; // 성공
*pnVar1 = 500; // 에러발생:const인 변수에 할당할 수 없습니다.
b) int const * pointer:
- int형 상수에 대한 포인터(pointer to const int)
- const int *piointer와 같은 표현
c) int * const pointer: 포인터 상수
- (주소를 가지는) 포인터 그 자체를 상수화 시킴
- int형에 대한 포인터 상수(const pointer to int)
- 주소는 변경 불가, 그러나, 포인터 변수가 가르키는 내용은 변경이 가능
- int * const pointer 해석(?): pointer가 상수이므로 변겨이 불가, 그러나, 포인터가 가르키는 내용은 변경가능
-예:
int nValue1 = 100;
int nValue2 = 200;
int *const pnVar1 = &nValue1;
pnVar1 = &nValue2; // 에러
*pnVar1 = 500; // 성공.
d) const int const *pointer
- 상수를 가리키는 상수 포인터
- int 형 상수에 대한 포인터 상수(const pointer to const int)
- 주소, 값 모두 변경 불가
- int const * const pointer는 같은 표현
int nValue1 = 100;
int nValue2 = 200;
int *const pnVar1 = &nValue1;
pnVar1 = &nValue2; // 에러
*pnVar1 = 500; // 에러
[직관적으로 정리]
# const 다음에 오늘 타입/내용은 변경 불가
# 예: int function(const char* list);
--> 함수의 경우 call by reference를 통해 값은변경하지 않고, 연결되는 주소만 바꾸어서 사용하기 위함이다.