const는 변수를 상수화 시켜 변경하지 못하도록 한다.
int a = 10;
const int b = 10;
a 는 프로그램 실행중 언제든지 변경 가능하지만, b는 변경할 수 없다. 일반적인 변수 선언에서 const의 위치에는 제약이 없다.
int const a = 10;
const int b = 10;
하지만 기본적으로는 첫번째 선언 int const a = 10이 기본 이다.
포인터 변수에서 const 사용은 매우(?) 주의를 기울여야 한다. const의 위치에 따라 의미와 기능이 완전히 달라지기 때문이다. const를 이용한 포인터 선언은 총 3가지가 있다.
- const int* ptr = &num
- int* const ptr = &num
- const int *const ptr = &num
1. const int* ptr = &num
int num = 10; // 또는 const num = 10;
const int* ptr = &num
변수 num를 가리키는 포인터 선언으로 ptr이 가리키는 대상은 변경할 수 없고(변수 num 변경 불가능), 가리키는 곳을 변경할수는 있다.
num++; // 가능
*ptr = 20; // 포인터가 상수화되어 있으므로 ptr이 가리키는 대상은 변경 불가능
ptr 초기화시 변수 a의 주소를 가리키게 한다음 변수 b의 주소를 가리키게 변경할 수 있다.
int a = 10;
int b = 20;
const int* ptr = &a;
ptr = &b;
const int* 로 선언된 포인터로는 포인터가 가리키는 주소영역의 값을 변경하는것은 불가능하지만, 포인터가 가리키는 주소는 변경 가능하다.
2. int* const ptr = &num
아래와 같은 선언을 상수 포인터라 한다. 일반적인 상수 선언과 마찬가지로 선언과 동시에 초기화를 시켜줘야한다. 즉 선언과 동시에 가리키는 영역을 지정해줘야한다. 단, const로 지정된 상수의 영역을 가리킬 수는 없다.
int num = 10;
int* const ptr = #
위 와같은 선언은 허용 되지만, 아래와 같은 선언은 허용되지 않는다.
const int num = 10;
int* const ptr = #
선언과 동시에 초기화된 ptr은 가리키는 영역을 변경 할 수는 없다.
3. const int* const ptr = &num
아래와 같은 선언을 상수에 대한 상수 포인터, 상수를 가리키는 상수 포인터라고 한다. 이 경우는 ptr이 가리키는 영역을 변경 할 수 없고, ptr을 통해 num의 값을 변경하는것 또한 불가능하다.
int num = 10;
const int* const ptr = #
정리.
포인터와 상수를 동시에 생각하다보니 많이 혼란스럽다.... 틀린 부분이 있으면 댓글 부탁드립니다.
- 끝 -
'Programming language > C' 카테고리의 다른 글
[C] C 언어 매크로, #define, (0) | 2023.03.13 |
---|---|
[C]trunc, truncf, truncl 함수, 소수점 이하 자리 버림 함수 (0) | 2023.03.01 |
[C] C언어 #연산자, ##연산자, c ## macro, 토큰 붙여넣기 연산자 (0) | 2023.02.27 |
[C] memset 사용법, memset 을 이용한 변수 초기화 (0) | 2023.02.25 |
[C] C언어, double to ascii, serial 통신에서 데이터 변환 (0) | 2022.12.30 |