본문 바로가기
파이썬/파이썬 기초

C언어 - 포인터에 대한 const 선언

by Go! Jake 2022. 5. 4.

const 선언은 변수를 상수화하여 값이 변경이 되지 않도록 선언할 때 사용되었습니다. 그렇다면 포인터에 대해 const를 선언한다는 것은 무슨 의미일까요?

포인터 변수가 참조하는 대상의 변경을 허용하지 않는 const 선언

const int* ptr로 포인터 선언 앞에 const를 붙이는 경우, 포인터를 이용한 변수 값 변경이 불가능합니다. 따라서, 아래 *ptr = 30;은 불가능합니다. 그 이유는 const int* ptr = #과 같이 가장 앞에 const 선언을 했기 때문입니다.

#include <stdio.h>

int main(){
	int num = 20;
	const int* ptr = &num;
	*ptr = 30;
//	num = 30;
	
	return 0;
}

결과:

[Error] assignment of read-only location '*ptr'

 

위 코드로는 컴파일이 되지 않습니다. *ptr = 30;으로 ptr이 가리키는 num 변수를 포인터를 이용해 변경하려고 했기 때문입니다. 다만 num = 30;으로는 변경이 가능합니다.

포인터 변수의 상수화

앞서는 const int* ptr을 통해 주소를 통한 변경을 제한하였습니다.

이번에는 const의 순서를 바꾸어 int* const ptr로 선언할 수 있습니다. 이 경우 포인터 변수 ptr이 상수가 됩니다. 따라서 주소 값이 저장되면 변경이 불가능합니다.

#include <stdio.h>

int main(){
	int num1 = 30;
	int num2 = 40;
	int* const ptr = &num1;
	ptr = &num2;
	
	return 0;
}

결과:

[Error] assignment of read-only location '*ptr'

마찬가지로 read-only라고 경고가 뜨면서 컴파일이 되지 않습니다. 이에 대한 이유는 ptr에 대해 변경할 수 없으나 num1 주소에서 num2를 가리키도록 변경하고자 하였기 때문입니다.

 

오늘은 포인터의 const 선언에 대해 알아보았습니다. const는 변수 안전성을 위해 설치되어 있습니다. 변경이 불필요한 포인터 등의 경우 const 선언을 통해 변경되는 부분을 제한하여 안정성을 높일 수 있습니다.

해당 내용은 윤성우 열혈 C프로그래밍을 참조하였습니다.

댓글