char* 와 char[]은 문자열 배열을 입력할수있는 자료형이다.
char str[] = "Test";
const char *str = "Test";
둘다 똑같은 문자열을 입력받는데 과연 포인터와 배열은 무엇이 다른지 알아보자
일단 두개의 사이즈가 다르다.
int main ()
{
char str1[] = "Test";
const char *str2 = "Test";
cout << "sizeof array " << sizeof(str1) << endl;
cout << "sizeof pointer " << sizeof(str2) << endl;
}
이 2개를 실행시켜보면
sizeof array 5
sizeof pointer 4
의 값이 나오게되는데 char[]은 Test와null문자를 포함한 5byte의 크기를 가지고
포인터의 경우에는 주소값이기 때문에 4byte의 크기를 가지게된다.
두번째로는 포인터상수 와 상수포인터이다.
char str1[] = "Test"; 는 포인터 상수이다. str1의 주소값은 상수로 지정되어 주소값 변경이 불가능합니다.
배열의 시작주소를 바꾸면 그 뒤에 값을 알수없기 때문입니다.
const char * str2 = "Test"; 는 상수 포인터이다. const char *는 값을 받을때 문자열 상수의 주소를 받게된다.
그러다 보니 문자열 상수의 값을 변경할려는 str2[1] = 's';를 허용하지 않는다. Test를 Tsst로 변경하는건 상수에서
허용하지 않기때문이다.
대입 할때는 문자열 상수를 Data 영역에 할당하게 되고 Data영역에 배열의 형태로 공간을 만든다.
이후 문자를 하나씩 대입하고, 마지막에는 NULL문자를 대입하게 된다. 메모리 할당이 완료되면 할당된 공간의 시작 주소를 반환한다.
const char *의 문자열 리털럴 변경
C++ 11이전에는 const를 제외하고 char *로 작성이 가능하였으나
문자열 리터럴의 유형이 "char of array"에서 "constant char의 array"로 변경되었습니다. char16_t 문자열 리터럴의 유형이 "일부 정수 유형의 배열"에서 "const char16_t의 배열"로 변경되었습니다. char32_t 문자열 리터럴의 유형이 "일부 정수 유형의 배열"에서 "const char32_t의 배열"로 변경되었습니다. 와이드 문자열 리터럴의 유형이“wray_t의 배열”에서“const wchar_t의 배열”로 변경되었습니다.
Rationale : 인수를 수정할 수있는 부적절한 오버로드 된 함수를 호출하지 않습니다.
원래 피처에 미치는 영향 : 잘 정의 된 피처의 의미로 변경합니다.
'C++' 카테고리의 다른 글
C++ malloc,callco,new (0) | 2020.09.01 |
---|---|
C++ 문자열 함수 (0) | 2020.08.31 |
C++ Point (0) | 2020.08.26 |
C++ Reference (0) | 2020.08.24 |
C++ 연산자 (0) | 2020.08.14 |