[C/C++] 포인터와 const (feat. const 키워드의 위치에 따른 차이점)

반응형
반응형

* 개인적인 공부 내용을 기록하는 용도로 작성한 글 이기에 잘못된 내용을 포함하고 있을 수 있습니다.

#1 상수를 가리키는 포인터 - const int *ptr

#2 상수 포인터 - int const *ptr

#3 상수를 가리키는 상수 포인터 - const int const *ptr


const는 변수를 상수화 시킬 때 사용하는 키워드입니다. 포인터도 주소를 저장할 때 사용하는 "자료형" 이기에, 마찬가지로 const 키워드를 사용할 수 있습니다. 단, const 키워드의 위치에 따라 그 기능이 달라집니다.

int a = 100;
const int *ptr = &a;
int const *ptr = &a;
const int const *ptr = &a;

 

#1 상수를 가리키는 포인터 - const int *ptr

const 키워드를 자료형 왼쪽에 붙여주면, 포인터가 가리키는 대상을 상수화 시킵니다. (변수가 상수가 아니더라도 상수 취급을 합니다.) 

따라서, 주소는 변경이 가능하지만 포인터로 직접 접근해 값을 변경하는 것은 불가능합니다. 상수를 가리키는 포인터는 주로 함수의 파라미터에서, 실수로 배열을 변경하지 못하도록 사용합니다. 

// 값 변경 X , 주소 변경 O
int a = 100;
int b = 200;
const int *ptr = &a;
ptr = &b; // o
*ptr = 300; // x

 

#2 상수 포인터 - int const *ptr

const 키워드를 자료형과 포인터 사이에 붙여주면 포인터 자체를 상수화 시킵니다. 일반적으로 포인터를 상수화 시킨다고 하면 상수 포인터를 의미합니다.

상수 포인터는 포인터가 상수화 되었기에, 주소는 변경이 불가능 하지만 값을 변경하는 것을 가능합니다.

// int const *ptr
// 값 변경 O , 주소 변경 X
int a = 100;
int b = 200;
int const *ptr = &a;
ptr = &b; // x
*ptr = 300; // o

 

#3 상수를 가리키는 상수 포인터 - const int const *ptr

1과 2의 개념을 모두 합친 포인터입니다. const 키워드를 양쪽에 붙여주면 주소, 값 모두 변경이 불가능합니다.

// const int const *ptr
// 값 변경 X, 주소 변경 X
int a = 100;
int b = 200;
const int const *ptr = &a;
ptr = &b; // x
*ptr = 300; // x

반응형

댓글

Designed by JB FACTORY