본문 바로가기

C언어/C언어 문법

[C언어] 상수형 포인터 (Const Pointer)

728x90
반응형

상수형 포인터

 

포인터를 상수로 선언하는 것도 가능하다.

 

이 때 주의할 점이 있는데 const 선언의 위치에 따라 의미가 달라진다는 점이다.

 

 

 

 

const int * ptr = #

 

예를 들어 위 코드처럼 선언했을 경우

 

포인터변수를 사용하여 변수에 접근하는 것은 허용되나

포인터변수를 역참조하여 변수를 수정하는 것은 불가능하다는 의미이다.

 

 

 

따라서 아래 코드처럼 사용하는 것이 불가능하다.

 

int num = 10;
const int * ptr = #
*ptr = 20;

 

 

 

 

그러나 포인터변수가 가리키고 있는 num까지 상수화된 것은 아니기때문에

아래 코드처럼 num의 값을 직접적으로 변경하는 것은 가능하다.

 

int num = 10;
const int * ptr = #
num = 20;

 

 

 

 

 

 

 

 

const 선언이 자료형 뒤로 갔을 경우에는 그 의미가 달라진다.

 

int * const ptr = #

 

위 코드와 같이 선언했을 경우

 

포인터변수 ptr을 상수취급하여 ptr이 가르키는 주소를 변경할 수 없다는 의미이다.

 

 

따라서 다음과 같은 코드는 컴파일 에러가 발생한다.

 

int num1 = 10;
int num2 = 20;
int * const ptr = &num1;
ptr = &num2;

 

 

그러나 이 때는 역참조를 통한 간접적 접근으로 변수의 값을 변경하는 것은 가능하다.

 

따라서 아래 코드는 문법적으로 문제가 없다.

 

int num = 10;
int * const ptr = #
*ptr = 20;

 

 

 

 

 

 

 

 

 

두 가지 의미를 가진 const 선언을 한 번에 할 수도 있다.

 

const int * const ptr = #

 

위 선언의 경우에는 const 가 갖고있는 두 가지 의미 모두를 지니고 있다고 생각하면 된다.

 

포인터가 가르키는 주소를 변경하는 것과 가리키고 있는 변수의 값을 수정하는 것

두 가지 모두 제한된다고 생각하면 된다.

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형