상수(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)는 일반 상수와 같이 선언과 동시에 초기화되어야 하며 그 값(가리킬 대상)을 변경할 수 없습니다.
그리고 가리키는 대상의 값을 상수로 생각하기에 상수는 물론 변수도 변경할 수 없습니다.