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

C 언어에서 const int*, int const*, const int* const의 차이점 완벽 정리


포인터란?

C 프로그래밍 언어에서 *p는 포인터에 저장된 값을 의미하고, p는 값이 저장된 주소를 나타냅니다. 이렇게 주소를 저장하는 변수를 포인터라고 부릅니다.

const int*int const*는 동일한 의미로, 포인터가 상수 int를 가리킬 수 있으며 해당 포인터가 가리키는 int 값은 변경할 수 없음을 나타냅니다. 하지만 포인터 자체는 상수가 아니기 때문에 포인터가 다른 상수 int를 가리키도록 변경하는 것은 가능합니다.

const int* const는 포인터가 상수 int를 가리키며, 포인터가 가리키는 int 값도 변경할 수 없고, 포인터 자체도 상수이므로 다른 상수 int를 가리키도록 변경할 수도 없습니다.

읽는 법칙: 오른쪽에서 왼쪽으로

const 선언 문법을 해석할 때는 오른쪽에서 왼쪽으로 읽는다는 기본 규칙을 기억하면 좋습니다.

// 상수 int를 가리키는 상수 포인터
const int * const
// 상수 int를 가리키는 포인터
const int *

예제 코드 (C)

아래 예제에서 주석 처리된 잘못된 코드의 주석을 해제하고 컴파일하면 어떤 오류가 발생하는지 직접 확인해 볼 수 있습니다.

#include <stdio.h>
int main() {
    //예제: int const*
    //참고: int const*는 const int*와 동일합니다.
    const int p = 5;
    // q는 상수 int를 가리키는 포인터입니다.
    int const* q = &p;
    //잘못된 할당
    // p의 값은 변경할 수 없습니다.
    // error: assignment of read-only location '*q'
    //*q = 7;
    const int r = 7;
    // q는 다른 상수 int를 가리킬 수 있습니다.
    q = &r;
    printf("%d", *q);
    //예제: int const* const
    int const* const s = &p;
    //잘못된 할당
    // s가 가리키는 값은 변경할 수 없습니다.
    // error: assignment of read-only location '*s'
    // *s = 7;
    //잘못된 할당
    // s 자체도 변경할 수 없습니다.
    // error: assignment of read-only variable 's'
    // s = &r;
    return 0;
}

실행 결과

7

정리

세 가지 선언 방식의 차이를 표로 요약하면 다음과 같습니다.

  • const int* / int const*: 가리키는 값은 수정 불가, 포인터 자체는 수정 가능
  • int* const: 가리키는 값은 수정 가능, 포인터 자체는 수정 불가
  • const int* const / int const* const: 가리키는 값과 포인터 자체 모두 수정 불가