상수(const)와 포인터

C언어 기본서로 공부할 때 항상 int *p가 변수를 가리키는 것만 봤지 const(상수)와 포인터를 같이 쓰는 걸 본 적이 없을 겁니다.

int *p가 변수를 가리킬 때는 가리킬 대상 자체를 변경할 수도 있고 가리키고 있는 대상의 값을 변경할 수도 있습니다.

그렇다면 상수를 가리키거나 포인터 변수가 상수일 때 어떤 특징을 가지는지 알아봅시다.

이번 글은 다음 네 가지를 알아봅니다.

  • int *p가 상수를 가리킬 때
  • const int *p가 변수와 상수를 가리킬 때
  • int *const p가 변수와 상수를 가리킬 때
  • const int *const p가 변수와 상수를 가리킬 때

 

int *p가 상수를 가리킬 때

const int num = 100;
int num2 = 200;
int *p;
p = #
//상수값을 바꿀 수 있다.
printf("%d\n", *p); //100
printf("%d\n", num);//100
*p = 1000;
printf("%d\n", *p); //1000
printf("%d\n", num);//1000
//가리킬 대상을 바꿀 수 있다.
p = &num2;
printf("%d\n", *p); //200

상수는 분명 변경할 수 없는 값이라 배웠습니다. 하지만 이렇게 포인터로 간접 지정하여 상수값을 변경할 수 있습니다.

포인터가 int형을 가리킨다고 생각하기 때문입니다. 상수값이 달라진다고 상수의 주소가 바뀌거나 하지 않습니다.

그리고 가리킬 대상을 바꿀 수 있습니다.(num -> num2)

 

const int *p가 변수와 상수를 가리킬 때

const int num = 100;
int num2 = 200;
const int *p;
//가리키는 대상이 상수든 변수든 값을 바꿀 수 없다.
p = #
*p = 1000; //불가능
p = &num2;
*p = 2000; //불가능
//가리킬 대상은 바꿀 수 있다.

const int 즉 상수를 가리킨다고 만들어진 포인터 변수(*p)는 가리키는 값이 상수든 변수든 변경할 수 없는 정수로 생각하기에 변경이 불가능합니다.

하지만 가리킬 대상 자체를 바꿀 수는 있습니다.(num -> num2)

 

int *const p가 변수와 상수를 가리킬 때

const int num = 100;
int num2 = 200;
//상수 포인터는 선언과 동시에 초기화되어야 한다.
int *const p = #
//상수값을 바꿀 수 있다.
printf("%d\n", *p); //100
*p = 1000;
printf("%d\n", *p); //1000
//가리킬 대상을 바꿀 순 없다.
p = &num2;  //불가능

int형을 가리키는 상수 포인터(*const p)는 일반 상수와 같이 선언과 동시에 초기화되어야 하며 그 값(가리킬 대상)을 변경할 수 없습니다.

하지만 가리키는 대상의 값은 상수든 변수든 변경할 수 있습니다.(int형을 가리킨다고 생각하므로)

 

const int *const p가 변수와 상수를 가리킬 때

const int num = 100;
int num2 = 200;
//상수 포인터는 선언과 동시에 초기화되어야 한다.
const int *const p = #
//가리키는 대상이 상수든 변수든 값을 바꿀 수 없다.
printf("%d\n", *p);
*p = 1000;  //불가능
printf("%d\n", *p);
//가리킬 대상을 바꿀 수도 없다.
p = &num2;  //불가능

const int 즉 상수를 가리킨다고 생각되는 상수 포인터(*const p)는 일반 상수와 같이 선언과 동시에 초기화되어야 하며 그 값(가리킬 대상)을 변경할 수 없습니다.

그리고 가리키는 대상의 값을 상수로 생각하기에 상수는 물론 변수도 변경할 수 없습니다.

SW Level Up

mail@swlevelup.com

You may also like...

댓글 남기기

이메일은 공개되지 않습니다.