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

C/C++에서 const int*, int * const, int const * const의 차이점 완벽 정리

const와 포인터 조합의 기본 의미

C/C++에서 const 키워드와 포인터(*)가 함께 사용되면 작성 위치에 따라 그 의미가 크게 달라집니다. 각 선언이 어떤 것을 의미하는지 아래와 같이 정리할 수 있습니다.

int*               // int를 가리키는 일반 포인터
int const * // 상수 int를 가리키는 포인터 → 가리키는 값 변경 불가
int * const // int를 가리키는 상수 포인터 → 포인터 자체 변경 불가
int const * const // 상수 int를 가리키는 상수 포인터 → 값과 포인터 모두 변경 불가

같은 의미를 갖는 표현들

const가 자료형 앞에 위치하든 뒤에 위치하든 의미는 동일합니다. 따라서 다음 두 표현은 서로 바꿔 사용할 수 있습니다.

  • const int * = int const *
  • const int * const = int const * const

코드 예제로 이해하기

int a = 10;
int b = 20;

// 1) const int* : 값 변경 불가, 포인터 재할당 가능
const int* p1 = &a;
// *p1 = 30; // 컴파일 오류!
p1 = &b; // 정상 동작

// 2) int* const : 값 변경 가능, 포인터 재할당 불가
int* const p2 = &a;
*p2 = 30; // 정상 동작
// p2 = &b; // 컴파일 오류!

// 3) const int* const : 둘 다 변경 불가
const int* const p3 = &a;
// *p3 = 30; // 컴파일 오류!
// p3 = &b; // 컴파일 오류!

복잡한 선언을 읽는 팁: 나선형 규칙(Spiral Rule)

이런 선언문을 읽다가 혼란스러울 때는 나선형 규칙을 활용해 보세요. 변수 이름에서 시작하여 시계 방향으로 다음 포인터나 타입으로 이동하고, 표현식이 끝날 때까지 이 과정을 반복하면 선언의 의미를 정확하게 해석할 수 있습니다.