반응형

C언어에서 Const 로 선언 하는 부분에 있어서는 특별하다.

어떤 특정 변수를 바뀌지 않는 "상수"로 선언하는 부분에 있어 보통 사용한다.

보통은 해당 코드에 대한 "안전성"을 위해 선언한다.  자세한 내용은 아래를 참고한다.

https://ansan-survivor.tistory.com/901

 

[C언어] C언어에서 Const 선언이 갖는 의미. (안전성 있는 상수 선언)

const 선언이 갖는 의미, 안정성. const 선언은 추가적인 기능을 제공하기 위한것이 아니라, 코드의 안정성을 높이기 위한 것이다. 따라서 이러한 const의 선언을 소홀히 하기 쉬운데,

ansan-survivor.tistory.com

 

Const를 통한 포인터 변수 선언은, 해당 포인터변수가 가리키는 대상이 변하지 못하게 함을 의미한다.
아래와 같이 const int* ptr = &num 일 경우, 이제 ptr 포인터변수는 num의 주소값을 가리키는데, 이는 const 선언을 했기 때문에 항상 고정되며, ptr이 가리키는 방향에 대한 수정은 불가능 하다. (ptr -> num)

 

<const int * ptr 형태>

그러나! 그렇다고 num의 값을 못바꾸는 것은 아니다. ptr 변수가 const 이기 때문에, 가리키는 방향을 바꿀 수 없을 뿐 가리키는 대상인 num은 const가 아니기 때문에 변경이 가능하다.

#include <stdio.h>

int main()
{
    int num = 10;

    // ptr이 가리키는 대상은 항상 num으로 고정. 변경 불가
    const int* ptr = &num;

    // ptr이 가리키는 대상은 변경이 불가하다.
    // num은 가리킴을 받는 대상이고 const 선언이 아니므로 변경 가능
    // *ptr = 20; - 불가
    num = 30;

    return 0;
}

 

<int * const ptr 형태>

이번엔 const가 뒤에 변수명 앞에 선언되었다. 

ptr에 있는 주소값이 상수가 되어 변경이 불가능하다. 즉 ptr에는 &num1 주소값 외 아무것도 변경할 수 없다.

그러나 num1 내에 있는 값을 변경하는 것은 허용된다. (*ptr = 40 으로 값 변경 가능)

int main()
{
	int num1 = 20;
	int num2 = 30;

	//ptr이 가리키는 대상은 num1 으로 고정하겠다고 선언.
	int * const ptr = &num1;

	//ptr = &num2;	컴파일 에러! 왜? ptr은 num1만을 가리키는 포인터로 고정했으므로.
	*ptr = 40;	//ptr이 num1을 가리키고있고, 주소에 접근해서 변경은 할 수 있다.

	return 0;
}

 

<const int * const ptr 형태>

이는 매우 강력한 형태로,

ptr은 영원히 num을 가리키고 있고, num의 값을 아무도 변경할 수 없고 참조만 가능하다...

 

int main()
{
	int num = 1;
	
	// 두 const선언을 동시에 하는 방법.
	const int * const ptr = &num;
	// 즉, ptr은 영원히 num을 가리키고 있고, num의 값을 아무도 변경할 수 없고 참조만 가능하다...

}

 

 

 

 

 

반응형

+ Recent posts