const int max = 200;
printf("%d\n", max);
이런식으로 변수 int 앞에 const 를 써 주면
선언과 동시에 초기화를 해 줘야 하며,
그 이후에는 값을 바꿀수 없다.
변수란 변하는 숫자를 의미하는데, 이 경우 정확히 말하면 변수가 아니라
상수가 되는 것이다.
즉, 변수의 상수화를 시키기 위해서 const 를 쓴다.
참고) const 는 constant "변함없는" 이라는 뜻의 약자
포인터 변수의 경우
const 를 앞에 붙이는 경우와, 뒤에 붙이는 경우 두가지가 있다.
int a = 0;
const int* p1 = &a;
int* const p2 = &a;
p1 의 경우에는 값을 변경할 수 없고(ex *p1 = 1; 하면 에러)
주소는 변경 할 수 있다.(p1++; 나 p1 = &b;(비는 다른변수) 가능)
p2 의 경우 값은 변경할 수 있고(ex *p2 = 1; 할수 있음)
주소는 변경 할 수 없다(p2++; 불가능 p2 =&b; 불가능)
외우는 요령은
const int number = 10; // 값을 못바꿈
const int* p = &a; // 값을 못바꿈
const 가 앞에 오면 값을 못바꿈이라고 외우면 될듯 하다.
const int* const p1 = &a;
앞뒤로 const 를 써주면, 값도 변경할 수 없고, 주소도 변경할 수 없다.
const char
const char max = 100;
printf("%d\n", max);
const char 은 const int 와 의미가 같다.
char a = 'a';
char b = 'b';
const char* p1 = &a;
char* const p2 = &a;
*p1 = 'b'; // 에러(값을 바꿀 수 없다)
*p2 = 'b';
p1 = &b;
p2 = &b; // 에러(주소를 바꿀 수 없다)
포인터도 동일하다.
하지만 const char* 이 값은 바꿀 수 없지만, 주소를 바꿀 수 있다는 점을 이용해서
문자열 변수를 만들 수 있다.
const char* str = "abcde";
printf("%c\n", str[0]);
printf("%c\n", str[1]);
printf("%c\n", str[2]);
printf("%c\n", str[3]);
printf("%c\n", str[4]);
또는
const char* str = "abcde";
printf("%c\n", *str); str++;
printf("%c\n", *str); str++;
printf("%c\n", *str); str++;
printf("%c\n", *str); str++;
printf("%c\n", *str);
중요한건 값을 변경할수 없다는 것은 잊지 말아야 한다.
*str = "12345"; 나 str[0] = "1"; 은 안된다는 것이다.
하지만....
const char* str = "abcde";
str = "1234567890";
이것은 가능하다. 얼핏 보면 값을 변경한듯 보이지만,
사실은 주소를 변경한 것이다.
str 은 주소를 담는 포인트 변수이고,
"1234567890" 이란 새로운 메모리 공간이 할당되어서, 주소가 변경된 것이다.
이로서 C언어에는 없는 문자열 자료형을 완벽하게
const char* 로 사용할 수 있다.
그냥 단순히 C언어에서는 const char* 은 문자열 자료형이야. 라고 생각해도 무방 할듯.
'C언어(2020년)' 카테고리의 다른 글
24. 함수 (0) | 2020.11.04 |
---|---|
23. define (0) | 2020.11.04 |
21. 구조체 (0) | 2020.11.03 |
20. bool 자료형 (0) | 2020.11.03 |
19. 연산자 (0) | 2020.11.03 |