728x90
Const
const는 기본적으로 값의 재할당을 방지하는 키워드로, 변수를 상수처럼 사용할 수 있게 해줍니다.
그러나 Const를 포인터 변수에 사용하는 경우, 사용되는 위치에 따라 의미가 달라지는데 확인해 보도록 하겠습니다.
우선 Const를 포인터에 사용할 시, 다음과 같이 두 위치에 사용이 가능합니다.
int num = 20;
const int * ptr1 = # 혹은 int const * ptr1 = #
int * const ptr2 = #
상수에 대한 포인터 - Const int * ptr
자료형 앞에 Const가 오는 경우 이때의 의미는 다음과 같습니다.
ptr을 통해 꺼내온 값은 변경될 수 없습니다.
또는
ptr이 꺼내온 값은 상수(변경될 수 없는 수)입니다.
주의할 점은 상수만 저장 가능한 것이 아닌, 포인터를 통해 꺼내온 값을 상수처럼 취급한다는 뜻입니다.
저는 두번째로 생각하는 것이 좀 더 와닿았습니다.
#include <stdio.h>
int main(){
int num = 20;
const int * ptr1 = #
//*ptr1 = 30; 오류, ptr1을 통해서는 변경될 수 없습니다.
num = 30;//ptr1 이 없다고 생각하면 너무나 당연합니다.
printf("%d\n", *ptr1);
const int constInt = 5;
ptr1 = &constInt;//가리키는 주소는 변경 가능
printf("%d\n", *ptr1);
return 0;
}
결과는 아래와 같습니다.
상수 포인터 - int * const ptr
포인터 자체를 상수로 만드는 것입니다.
즉 포인터에 한 번 할당된 주소는 바뀌지 않습니다.
그러나 포인터가 가리키는 값은 얼마든지 바꿀 수 있습니다.
#include <stdio.h>
int main(){
int num = 5;
int * const ptr = #
int * newPtr;
//ptr = newPtr; 오류 ! 새로운 주소값으로 재지정 불가능
//ptr = # 오류 : 재지정, 변경 불가능
printf("%d\n", *ptr);
*ptr = 10; //가능 : 포인터를 통해 얻은 값을 변경하는 것은 가능
printf("%d\n", *ptr);
int arr[] = {1,2,3};
int * ptr2;
ptr2 = arr; //가능
//arr = ptr2; 불가능!, 즉 알고보면 배열을 * const 타입
return 0;
}
문자열과 const 포인터
문자열은 배열로 정의할 수 있고, 포인터로도 정의할 수 있었습니다.
각각의 상황에 대해 살펴보도록 하겠습니다.
문자 배열로 문자열 선언
문자 배열로 선언된 문자열은 char * const 타입입니다.
즉 재할당은 불가능하지만, 문자열의 값은 바꿀 수 있습니다.
#include <stdio.h>
int main(){
char arr[] = "first";
arr[2] = 'd';
//arr = "change"; 오류
printf("%s\n", arr);
return 0;
}
자동할당 문자열과 포인터로 문자열 선언
const char * 타입입니다.
즉 문자열의 값을 변경하는 것은 불가능하지만, 새로운 주소를 할당하는 것은 가능합니다.
#include <stdio.h>
int main(){
char * arr = "first";
//arr[2] = 'd'; 런타임 에러
arr = "change";
printf("%s\n", arr);
return 0;
}
728x90
'c언어' 카테고리의 다른 글
[C언어] - 이중 포인터 (0) | 2022.05.06 |
---|---|
[C언어] - 다차원 배열 (0) | 2022.05.06 |
[C언어] - Call By Value (0) | 2022.04.20 |
[C언어] - 포인터 (0) | 2022.04.19 |
[C언어] - 문자열 (0) | 2022.04.19 |