C

C 공부 12일차 Chapter 14 포인터 대상 const 선언의 두가지 형태

yeooniyeoon 2022. 9. 17. 23:57
728x90
SMALL

포인터 대상 const 선언

포인터 변수를 대상으로 const 선언을 하는 데에는 두가지 형태가 있다.

 

 

첫번째는 포인터 변수가 참조하는 대상의 값을 변경하지 못하는 형태이다.

 

아래 코드와 같이 포인터 변수 선언의 맨 앞부분에 const가 위치하면

포인터 변수가 가리키는 대상의 값을 변경하지 못한다는 의미가 된다.

 

선언방법은 다음과 같다

 

int num = 20;
const int * ptr = #
*ptr = 40;	//컴파일 오류
num = 40;	//컴파일 오류 발생하지 않음

 

따라서 *ptr=30 과 같은 문장 작성 시 컴파일 오류가 발생한다.

 

그러나 변수 num이 상수화 되는 것은 아니기 때문에

num=40 처럼 변수에 저장된 값은 컴파일 오류없이 변경이 가능하다.

'포인터 변수가 가리키는 대상'의 값을 변경하는 것을 허용하지 않는 것이기 때문에

변수 num의 값을 변경하는 것은 가능한 것이다.

 

 

 

두번째 형태는 포인터 변수를 상수화 하는 것이다.

 

이는 const를 변수명 앞에 선언해준다.

포인터 변수가 가리키는 값을 변경할 수 없게 되는 것이다.

한 번 주소를 저장하면 끝까지 그 주소만 가리켜야 한다.

 

int num1=40, num2=30;
int * const ptr = &num1;
ptr = &num2;	//컴파일 오류
*ptr = 10;

 

따라서 위 코드의 3번째 행은 오류가 발생한다.

포인터 변수 선언 시 num1을 가리키도록 했으므로 가리키는 값의 변경이 불가한 것이다.

반면 ptr이 가르키는 대상의 값을 변경하는 4번째 행은 오류가 발생하지 않는다.

const가 변수명 앞에 위치했기 때문에 첫번째 형태와 다른 의미를 갖기 때문이다.

 

 

 

이처럼 const가 어디에 위치하느냐에 따라 상수화 되는 부분이 달라진다.

물론 첫번째 방법과 두번째 방법을 동시에 사용하는 것도 가능하다.

 

int num=40;
const int * const ptr = #

 

위 코드의 ptr은 가리키는 대상의 값을 변경하는 것이 불가하며

ptr이 가리키는 대상의 변경도 불가능하다.

 

 

const는 원래 C++에서만 사용되었지만 C언어의 표준을 정립하는 과정에서 들여오게 되었다.

원의 면적을 구하는 함수를 작성할 경우 파이값은 변하지 않는 상수여야 한다.

이런 경우, 파이값이 수정되지 않도록 const 선언이 필요하다.

이렇듯 const는 사소해 보이지만 중요한 역할을 한다! ! !

 

728x90
반응형
SMALL