const는 왼쪽으로 작용하는 keyword이다. 왼쪽에 아무것도 없다면 오른쪽으로 작용한다.
const의 위치에 따라 어떻게 다른지 정리해보자.
세 줄 요약
1.
const char* 와 char const*는 같다. 왜?
2.
const키워드는 왼쪽에 있는걸 const화 시킨다
3.
왼쪽에 아무것도 없으면 오른쪽으로 작용한다
char const * p
•
char를 const화 한다.
•
p가 가리키는 대상은 변경 가능하지만,
•
p가 가리키는 대상의 값은 변경할 수 없다.
#include <stdio.h>
int main(void)
{
char a[] = {'a', 'b'};
char const *p;
p = &a[0];
printf("%c\n", *p);
p = &a[1];
printf("%c\n", *p);
// *p = 'c'; // error: read-only variable is not assignable
a[1] = 'd';
printf("%c\n", *p);
return 0;
}
C
복사
•
8번 줄에서 p에 a[0]의 주소값을 할당했는데 10번줄에서 p가 가리키는 대상을 변경하고 있다.
◦
p가 가리키는 대상 변경 가능
•
12번줄전까지 a[1]과 p는 같은 곳을 가리키고있음. 12번 줄에서 a[1]의 값을 변경하고 13번줄에서 p가 가리키는 값을 출력하니 12번줄에서 변경한 ‘c’가 출력됨.
•
13번 줄. p가 가리키는 대상을 변경하려하니 에러가 발생함. p는 const char를 가리키기 때문. 그러나 a는 이러한 제한이 없으니 12번줄처럼 값 변경 가능.
const char * p
•
char를 const화 한다. (왼쪽에 아무것도 없어서 오른쪽으로 작용.)
•
p가 가리키는 대상은 변경 가능하지만,
•
p가 가리키는 대상의 값은 변경할 수 없다.
#include <stdio.h>
int main(void)
{
char a[] = {'a', 'b'};
const char *p;
p = &a[0];
printf("%c\n", *p);
p = &a[1];
printf("%c\n", *p);
// *p = 'c'; // error: read-only variable is not assignable
a[1] = 'd';
printf("%c\n", *p);
return 0;
}
C
복사
•
char const * p와 동일함
char * const p
•
*를 const화 한다. (포인터가 const화 됨)
•
p가 가리키는 대상을 변경할 수 없다.
#include <stdio.h>
int main(void)
{
char a[] = {'a', 'b'};
char * const p = &a[0];
printf("%c\n", *p);
// p = &a[1]; // error: cannot assign to variable 'p' with const-qualified type 'char *const'
*p = 'c';
printf("%c\n", *p);
a[0] = 'd';
printf("%c\n", *p);
return 0;
}
C
복사
•
p가 가리키는 대상의 값은 변경 가능하다.
•
7번 줄. 상수의 선언이기에 선언과 동시에 초기화를 해줘야 한다.
•
9번 줄. const화 된 변수 p의 값을 변경하려고 하니 에러가 발생.
•
10번 줄. p가 가리키는 대상의 값은 변경 가능.
•
12, 13번 줄. p가 가리키는 대상은 a[0]이고 p를 통해서는 이 값을 못바꾸지만 a를 통해서는 변경 가능함.
char const * const p
•
첫번째 const는 char를 const화 한다.
•
두번째 const는 *를 const화 한다.
•
p가 가리키는 대상을 변경할 수 없으며 p가 가리키는 대상의 값도 변경할 수 없다.
#include <stdio.h>
int main(void)
{
char a[] = {'a', 'b'};
char const * const p = &a[0];
printf("%c\n", *p);
// p = &a[1]; // error: cannot assign to variable 'p' with const-qualified type 'const char *const'
// *p = 'c'; // error: read-only variable is not assignable
a[0] = 'd';
printf("%c\n", *p);
return 0;
}
C
복사
const char * const p
#include <stdio.h>
int main(void)
{
char a[] = {'a', 'b'};
const char * const p = &a[0];
printf("%c\n", *p);
// p = &a[1]; // error: cannot assign to variable 'p' with const-qualified type 'const char *const'
// *p = 'c'; // error: read-only variable is not assignable
a[0] = 'd';
printf("%c\n", *p);
return 0;
}
C
복사
•
char const * const p와 동일함.
정리
// const char를 가리키는 포인터. 아래 두 선언은 같다.
// 첫번째는 const가 왼쪽의 char를 const화 한다.
// 두번째는 const의 왼쪽에 아무것도 없으니 오른쪽의 char를 const화 한다.
// p가 가리키는 대상은 변경 가능하지만
// p가 가리키는 대상의 값은 변경할 수 없다.
char const * p;
const char * p;
// *를 const화 한다. 즉 const pointer가 된다.
// p가 가리키는 대상을 변경할 수 없다.
// p가 가리키는 값은 변경할 수 있다.
char * const p;
// 아래 두 선언은 같다.
// 첫번째 const는 char를 const화 한다.
// 두번째 const는 *를 const화 한다.
// p가 가리키는 대상을 변경할 수 없으며 p가 가리키는 대상의 값도 변경할 수 없다.
char const * const p;
const char * const p
C
복사