C 언어 상수 포인터 & 상수 가리키는 포인터 완전 정복
C에서 포인터는 다른 변수의 메모리 주소를 저장하는 변수이고, const 키워드는 한 번 초기화되면 값을 변경할 수 없는 변수나 포인터를 정의하는 데 쓰입니다. 포인터와 const 키워드를 결합하면 두 가지를 제어할 수 있습니다.
- 포인터에 저장된 주소를 변경할 수 있는지 여부
- 그 주소에 저장된 값을 변경할 수 있는지 여부
이 장에서는 상수 포인터의 세 가지 주요 변형을 살펴봅니다.
- 상수 포인터 (Constant Pointer)
- 상수를 가리키는 포인터 (Pointer to Constant)
- 상수를 가리키는 상수 포인터 (Constant Pointer to Constant)
상수 포인터 (Constant Pointer)
상수 포인터는 포인터 자체가 상수라는 의미입니다. 한 번 메모리 위치를 가리키도록 초기화되면 다른 위치를 가리킬 수 없지만, 그 위치에 저장된 값은 여전히 변경할 수 있습니다.
상수 포인터 문법은 다음과 같습니다.
data_type *const pointer_name = &variable;
이 문법에서 data_type은 포인터가 가리키는 데이터 타입, *const가 포인터 자체를 상수로 만듦, pointer_name은 포인터 이름, &variable이 변수 메모리 주소를 할당합니다.
상수 포인터 예제
이 예제에서 상수 포인터 ptr을 선언하고 변수 x 주소로 초기화합니다. 그런 다음 ptr로 x 값을 변경하고 출력합니다.
#include <stdio.h>
int main() {
int x = 10;
int y = 20;
int *const ptr = &x; // int 타입 상수 포인터
printf("x 값: %d\n", *ptr);
*ptr = 15; // 주소 값 변경 가능
printf("수정된 x 값: %d\n", *ptr);
// ptr = &y; // 포인터 주소 변경 불가
return 0;
}
위 프로그램 출력은 포인터가 x에 고정돼 있지만 x 값은 업데이트 가능함을 보여줍니다.
x 값: 10
수정된 x 값: 15
상수 포인터 에러 예제
여기서 상수 포인터 ptr을 선언하고 변수 x 주소로 초기화한 후, 변수 y 주소를 가리키게 하려 합니다. 이는 상수 포인터가 초기화 후 다른 메모리 위치를 가리킬 수 없으므로 에러 발생합니다.
#include <stdio.h>
int main() {
int x = 10;
int y = 20;
int *const ptr = &x; // int 타입 상수 포인터
printf("x 값: %d\n", *ptr);
// y를 가리키려 시도
ptr = &y; // 상수 포인터 주소 변경 불가
return 0;
}
아래 에러를 볼 수 있습니다. 상수 포인터 주소 변경 불가.
error: assignment of read-only variable 'ptr'
상수를 가리키는 포인터 (Pointer to Constant)
상수를 가리키는 포인터는 가리키는 값을 변경할 수 없지만, 포인터 자체는 다른 메모리 주소(또는 변수)를 가리킬 수 있습니다.
상수를 가리키는 포인터 문법은 다음과 같습니다.
const data_type *pointer_name = &variable;
data_type const *pointer = &variable;
이 문법에서 const data_type 또는 data_type const는 포인터가 상수 값을 가리킴을 의미, pointer_name은 포인터 이름, &variable이 변수 주소 할당.
상수를 가리키는 포인터 예제
이 예제에서 상수 값을 가리키는 포인터 ptr을 선언하고 변수 a 주소 할당. 그런 다음 포인터를 변수 b 다른 주소로 변경하고 값 출력.
#include <stdio.h>
int main() {
int a = 5;
int b = 30;
const int *ptr = &a; // 상수 int 가리키는 포인터
printf("a 값: %d\n", *ptr);
// *ptr = 10; // 포인터로 값 수정 불가
ptr = &b; // 포인터 주소 변경
printf("이제 b 가리킴: %d\n", *ptr);
return 0;
}
위 프로그램 출력은 같은 포인터가 다른 변수들 가리킴을 보여줍니다.
a 값: 5
이제 b 가리킴: 30
상수를 가리키는 포인터 에러 예제
여기서 상수를 가리키는 포인터 ptr을 선언하고 변수 a 주소로 초기화. 그런 다음 포인터로 a 값 변경 시도. 이는 상수를 가리키는 포인터가 가리키는 값 수정을 허용하지 않으므로 에러 발생.
#include <stdio.h>
int main() {
int a = 5;
const int *ptr = &a; // 상수 int 가리키는 포인터
printf("a 값: %d\n", *ptr);
// 상수 가리키는 포인터로 값 수정 불가
*ptr = 10;
return 0;
}
아래 출력은 상수를 가리키는 포인터로 값 수정 불가 에러 보여줍니다.
error: assignment of read-only location '*ptr'
상수를 가리키는 상수 포인터 (Constant Pointer to Constant)
상수를 가리키는 상수 포인터는 포인터가 메모리 주소를 변경할 수 없고, 그 메모리 주소에 저장된 값도 변경할 수 없습니다. 두 동작 모두 제한되므로 값만 읽을 수 있습니다.
상수를 가리키는 상수 포인터 문법:
const data_type *const pointer_name = &variable;
이 문법에서 −
- const data_type은 메모리 위치 값이 포인터로 변경 불가함을 나타냄.
- *const pointer_name은 포인터 자체가 초기화 후 다른 메모리 주소 가리킬 수 없음 의미.
- &variable이 포인터에 변수 메모리 주소 할당.
상수를 가리키는 상수 포인터 예제
이 예제에서 상수를 가리키는 상수 포인터 ptr을 선언하고 변수 a 메모리 주소 할당. 포인터로 a 값 출력.
#include <stdio.h>
int main() {
int a = 10;
const int *const ptr = &a; // 상수 가리키는 상수 포인터
printf("a 값: %d\n", *ptr);
// *ptr = 15; // 값 수정 불가
// ptr = &b; // 포인터 위치 변경 불가
return 0;
}
위 프로그램 출력:
a 값: 10
상수를 가리키는 상수 포인터 에러 예제
이 예제에서 상수를 가리키는 상수 포인터 ptr을 선언하고 변수 a로 초기화. 그런 다음 포인터로 값 수정 시도와 다른 변수 가리키게 시도. 두 연산 모두 허용 안 돼 컴파일 에러 발생.
#include <stdio.h>
int main() {
int a = 10;
int b = 20;
const int *const ptr = &a; // 상수 가리키는 상수 포인터
printf("a 값: %d\n", *ptr);
// *ptr = 15; // 값 수정 불가
// ptr = &b; // 포인터 주소 변경 불가
return 0;
}
아래 출력에서 에러 확인:
a 값: 10
상수 포인터 유형 간 차이
다음 표는 상수 포인터, 상수 가리키는 포인터, 상수 가리키는 상수 포인터 간 차이를 보여줍니다.
| 변형 |
정의 |
주소 변경 가능? |
값 변경 가능? |
문법 예시 |
| 상수 포인터 |
주소 고정, 해당 주소 값 수정 가능 |
아니오 |
예 |
int *const p = &x; |
| 상수 가리키는 포인터 |
다른 주소 가리킬 수 있으나 가리키는 값 수정 불가 |
예 |
아니오 |
const int *p = &x; |
| 상수 가리키는 상수 포인터 |
주소 고정, 해당 주소 값 수정 불가 |
아니오 |
아니오 |
const int *const p = &x; |
결론
이 장에서 C의 상수 포인터와 상수 가리키는 포인터를 다뤘습니다. 상수 포인터는 주소 고정하지만 값 변경 허용, 상수 가리키는 포인터는 주소 변경 허용하지만 값 변경 불가, 상수 가리키는 상수 포인터는 둘 다 제한.