Always Be Wise

상수 포인터 본문

프로그래밍 언어/C

상수 포인터

bewisesh91 2021. 12. 4. 13:00
728x90

일반 변수에서 값을 절대 바꿀 수 없는 상수가 있듯이, 포인터에도 주소 값을 바꿀 수 없는 상수 포인터가 있다.

 

const가 맨 앞에 오는 경우

const int *ptr과 같이 const를 가장 앞에 사용하게 되면, 이 포인터를 이용해 변수의 값을 변경하는 것을 막는다.

아래 코드에서 const로 선언하지 않은 ptr1은 *ptr1을 이용해 값 20을 변경할 수 있다. 하지만 const로 선언된 ptr2는 값 대입시 

오류가 발생한다. 그렇지만 변수 num 자체가 상수인 것은 아니다. num = 30처럼 값을 변경하는 것은 가능하다. 

#include <stdio.h>

int main()
{
	int num = 10;
	int *ptr1 = &num;
	const int *ptr2 = &num;

	*ptr1 = 20;
	num = 30;

	*ptr2 = 40;

	return 0;
}

 

자료형 다음에 const가 오는 경우

int *const ptr과 같이 자료형 다음에 const를 선언하게 되면, 포인터 변수 자체가 상수화 되어 주소 값을 변경할 수 없다.

이때, *은 const 전에 위치해야 한다. 만약 int const *ptr처럼 사용한다면 const int *ptr와 같은 효과가 나타난다.

아래 코드에서 int *const ptr2 = &num1이라고 선언하였다. 해당 포인터를 이용해서 값을 변경하는 것은 가능하지만 포인터가

가리키고 있는 주소를 변경하는 것은 불가능하다. 따라서 *ptr2 = 30은 가능하지만, ptr2 = &num2는 불가능ㅇ하다.

즉, "이 포인터가 오로지 num1 변수만을 가리키며, 절대 다른 변수를 가리키지 않겠다"는 의미이다. 

#include <stdio.h>

int main()
{
	int num1 = 10, num2 = 20;
	int *ptr1 = &num1;
	int* const ptr2 = &num1;
	
	ptr1 = &num2;
	
	*ptr2 = 30;
	ptr2 = &num2;
	
	return 0;
}

 

'프로그래밍 언어 > C' 카테고리의 다른 글

구조체란?  (0) 2021.12.04
이중 포인터와 포인터 배열  (0) 2021.12.04
포인터 연산과 배열  (0) 2021.12.04
Call by value & Call by reference  (0) 2021.12.04
포인터란?  (0) 2021.12.04
Comments