Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C 언어에서 상수에 대한 포인터란 무엇일까? 핵심 개념과 예제로 완벽 이해하기

C 언어에서 상수에 대한 포인터란 무엇인가?

C 언어에서 상수에 대한 포인터(pointer to constant)란 포인터가 가리키는 메모리 공간의 을 상수처럼 다루겠다는 의미입니다. 즉, 포인터를 역참조하여 그 값을 변경하려고 하면 컴파일 단계에서 오류가 발생합니다.

여기서 중요한 점은 상수가 되는 대상이 '포인터 변수 자체'가 아니라 '포인터가 가리키는 값'이라는 사실입니다. 따라서 포인터가 다른 주소를 가리키도록 변경하는 것은 여전히 가능합니다.

선언 방법

상수에 대한 포인터는 아래와 같은 형식으로 선언합니다.

Data_Type const* Pointer_Name;

예를 들면 다음과 같습니다.

int const *p;   // 상수 정수를 가리키는 포인터
const int *q;   // 위 선언과 완전히 동일한 의미

const int*int const*는 같은 표현이며, 모두 '변경할 수 없는 정수값을 가리키는 포인터'를 뜻합니다.

예제 1: const를 적용한 경우

다음은 상수에 대한 포인터의 동작을 보여주는 C 프로그램입니다.

#include<stdio.h>

int main(void){
    int var1 = 100;
    // 상수 정수에 대한 포인터
    const int* ptr = &var1;
    // 가리키는 주소의 값을 변경 시도
    *ptr = 10;
    printf("%d\n", *ptr);
    return 0;
}

실행 결과

위 프로그램을 컴파일하면 다음과 같은 오류 메시지가 출력됩니다.

error: assignment of read-only location '*ptr'
(읽기 전용 위치 '*ptr'에 값을 할당할 수 없습니다)

ptr이 가리키는 대상이 const로 선언되어 있기 때문에, *ptr = 10;과 같이 역참조를 통한 값 수정이 허용되지 않습니다.

예제 2: const를 제거한 경우

그렇다면 const 키워드를 빼면 어떻게 될까요? 아래 프로그램으로 직접 확인해 보겠습니다.

#include<stdio.h>

int main(void){
    int var1 = 100;
    // const 없이 일반 포인터 선언
    int* ptr = &var1;
    // 가리키는 주소의 값을 변경 시도
    *ptr = 10;
    printf("%d\n", *ptr);
    return 0;
}

실행 결과

10

const가 없는 일반 포인터는 가리키는 대상의 값을 자유롭게 수정할 수 있습니다. 따라서 *ptr = 10;이 정상적으로 실행되며, 출력 결과는 10입니다.

참고: 상수 포인터와의 차이

'상수에 대한 포인터'와 자주 혼동되는 개념으로 상수 포인터(constant pointer)가 있습니다. 두 개념의 차이를 정리하면 다음과 같습니다.

  • const int* p;상수에 대한 포인터: 가리키는 값은 변경 불가, 포인터가 가리키는 주소는 변경 가능
  • int* const p;상수 포인터: 포인터가 담고 있는 주소는 변경 불가, 가리키는 값은 변경 가능
  • const int* const p; → 값과 주소 모두 변경 불가

이처럼 const 키워드의 위치에 따라 의미가 완전히 달라지므로, 코드를 작성할 때 주의 깊게 살펴보는 것이 좋습니다.