Search
Duplicate

const char* 와 char const*는 같다. 왜?

간단소개
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
C
Scrap
태그
키워드
포인터
9 more properties
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
복사

참조