C언어(2020년)

22. const

리더2333 2020. 11. 4. 00:00
반응형
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