MINERVA/C_CPP 2022. 4. 18. 15:37
반응형

const 키워드는 개발중에는 자연스럽게(?)사용하다가, 질문을 받고 설명하려고 하면 은근히 까다롭게 느껴져정리를 하고자 합니다. 개발자마다 설명하는 방법이 여러가지 있을 수 있지만, 저의 경우는 아래 개념으로 이해를 하고 있습니다.

 

1. const(constant) 키워드란?

- 상수로 만든다, 변경할수 없게 만든다.

- 변수 또는 포인터 변수를 상수로 만든다. --> 변수의 상수화

- const를 사용한 변수는 반드시 초기화 되어야 함(생각해 보면 당연함!)

 

2. 어디에 위치하는가?

- https://www.geeksforgeeks.org/memory-layout-of-c-program/

 

Memory Layout of C Programs - GeeksforGeeks

Memory Layout of C Programs

www.geeksforgeeks.org

[memory layout]

- 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를 통해 값은변경하지 않고, 연결되는 주소만 바꾸어서 사용하기 위함이다.

 

 

반응형
posted by choiwonwoo
: