C언어에서 Const 로 선언 하는 부분에 있어서는 특별하다.
어떤 특정 변수를 바뀌지 않는 "상수"로 선언하는 부분에 있어 보통 사용한다.
보통은 해당 코드에 대한 "안전성"을 위해 선언한다. 자세한 내용은 아래를 참고한다.
https://ansan-survivor.tistory.com/901
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 = #
// 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 = #
// 즉, ptr은 영원히 num을 가리키고 있고, num의 값을 아무도 변경할 수 없고 참조만 가능하다...
}
'C언어 \ C++ > 포인터 \ 배열' 카테고리의 다른 글
[C언어] C언어 3차원 배열 선언 및 초기화 (0) | 2022.02.09 |
---|---|
[C언어] C언어 2차원 배열 선언 및 초기화 (0) | 2022.02.08 |
[C언어] 함수의 받는 인자(input)로 배열(array) 전달하기, 배열을 변경하는 함수 (0) | 2022.02.06 |
[C언어] 변수 값 바꾸기 Swap 예제 (포인터 예제 포함) (0) | 2022.02.06 |
[C언어] 배열 내에 여러 문자열 저장하기, 출력하기 (0) | 2022.02.06 |