#include <stdio.h>
int main(void)
{
{
char c = 'a';
wchar_t wc = L'a'; // 문자 하나를 2바이트로 쓰겠다는 뜻으로 L을 앞에붙임
char szChar[10] = "abcdef";
wchar_t szWChar[10] = L"abcdef";
// 위 배열의 크기는 20바이트, 넣은건 14바이트 (마지막은 null문자)
short arrShort[10] = { 97, 89, 99, 100, 101, 102 };
////////////////////////////////////////////////////////
const wchar_t* pChar = L"abcdef"; // 이것도 됨 (왜?)
}
return 0;
}
앞에 L이 붙으면 저 글자 하나하나가 다 2바이트가 됨
short 배열과 wchar 배열의 메모리 주소에 담긴 값은 똑같음, 다만 short에 문자열을 넣을 수는 없음
문자열을 포인터 변수로 받을 수 있는 이유는? --> 문자열이 주소값을 반환하기 때문
다만 포인터 변수와 크기를 맞춰줘야 함
const char* szChar = L"abcdef";
이나 const wchar_t* pChar = "abcdef";
은 못받음 (단위가 안맞음)
#include <stdio.h>
int main(void)
{
{
char c = 'a';
wchar_t wc = L'a';
char szChar[10] = "abcdef";
wchar_t szWChar[10] = L"abcdef";
short arrShort[10] = { 97, 89, 99, 100, 101, 102 };
////////////////////////////////////////////////////////
const wchar_t* pChar = L"abcdef";
szWChar[1] = 'z';
// pChar[1] = 'z';
// *(pChar + 1) = 'z';와 같음
}
return 0;
}
szWChar[1]
은 변경할 수 있지만, pChar[1]
은 변경할 수 없음
szWChar[1]
은 l-value
, pChar[1]
은 r-value
<-- why?
szWChar
은 10개의 영역을 선언하고 그곳에 문자열 값을 복사해오는 것이지만
pChar
은 메모리 영역 어딘가에 선언된 문자열 자체의 주소를 가리키는 것이기 때문에 그런거임
szWChar[1]
값을 바꾸는건 복사된 값을 바꾸는 것이지만
pChar[1]
의 값을 바꾸는건 코드 실행도중에 코드 자체를 바꿔버리는 행위이기 때문에 ROM
가 보호함 <-- 실행 도중에 자기 코드를 막 바꿔버린다는 의미라 막힌거임
const 포인터로 받아서 못바꾸는거라 생각할 수 있는데 애초에 문자열의 반환타입이 const 포인터임
물론 wchar_t* pChar = (wchar_t*)L"abcdef";
이렇게 억지로 캐스팅해서 받아올수도 있긴함, 이러면 수정도 됨
다만 읽는건 가능 --> pChar[0];
이건 아무 문제가 없음