[C] const 와 포인터, const pointer, pointer const

728x90
반응형

const는 변수를 상수화 시켜 변경하지 못하도록 한다. 

int a = 10;
const int b = 10;

a 는 프로그램 실행중 언제든지 변경 가능하지만, b는 변경할 수 없다. 일반적인 변수 선언에서 const의 위치에는 제약이 없다.

int const a = 10;
const int b = 10;

 

 

하지만 기본적으로는 첫번째 선언 int const a = 10이 기본 이다.


포인터 변수에서 const 사용은 매우(?) 주의를 기울여야 한다. const의 위치에 따라 의미와 기능이 완전히 달라지기 때문이다. const를 이용한 포인터 선언은 총 3가지가 있다. 

  • const int* ptr = &num 
  • int* const ptr = &num
  • const int *const ptr = &num

1. const int* ptr = &num

int num = 10; // 또는 const num = 10;
const int* ptr = &num

변수 num를 가리키는 포인터 선언으로 ptr이 가리키는 대상은 변경할 수 없고(변수 num 변경 불가능), 가리키는 곳을 변경할수는 있다.

num++; // 가능 
*ptr = 20; // 포인터가 상수화되어 있으므로 ptr이 가리키는 대상은 변경 불가능

ptr 초기화시 변수 a의 주소를 가리키게 한다음 변수 b의 주소를 가리키게 변경할 수 있다.

int a = 10;
int b = 20;
const int* ptr = &a;
ptr = &b;

 

const int* 로 선언된 포인터로는 포인터가 가리키는 주소영역의 값을 변경하는것은 불가능하지만, 포인터가 가리키는 주소는 변경 가능하다. 

 

2. int* const ptr = &num

아래와 같은 선언을 상수 포인터라 한다. 일반적인 상수 선언과 마찬가지로 선언과 동시에 초기화를 시켜줘야한다. 즉 선언과 동시에 가리키는 영역을 지정해줘야한다. 단, const로 지정된 상수의 영역을 가리킬 수는 없다.

int num = 10;
int* const ptr = #

위 와같은 선언은 허용 되지만, 아래와 같은 선언은 허용되지 않는다. 

const int num = 10;
int* const ptr = #

선언과 동시에 초기화된 ptr은 가리키는 영역을 변경 할 수는 없다.

 

3. const int* const ptr = &num

아래와 같은 선언을 상수에 대한 상수 포인터, 상수를 가리키는 상수 포인터라고 한다. 이 경우는 ptr이 가리키는 영역을 변경 할 수 없고, ptr을 통해 num의 값을 변경하는것 또한 불가능하다. 

int num = 10;
const int* const ptr = #

 

정리. 

 

포인터와 상수를 동시에 생각하다보니 많이 혼란스럽다.... 틀린 부분이 있으면 댓글 부탁드립니다. 

 

- 끝 -

728x90
반응형