CPP_어소_35_문자열 (1)

CJB_ny·2022년 6월 22일
0

CPP_AROTHO

목록 보기
33/83
post-thumbnail

wchar_t는 문자하나를 2바이트로 표현하겠다!

문자를 2바이트로 쓴다고 하려고 하면

wchar_t = L'a'; L이라고 명시를 해주어야

문자 하나를 2바이트로 사용을 하겠다라는 의미이다.

wchar_t

2바이트 문자열의 경우 똑같이 앞이 L붙여줘야 한다.

문자 하나하나가 2바이트 단위 라는 것을 명시해줌

문자열 크기?

wchar_t szWChar[10] = L"abcdef";

이렇게 했을 때,

총 크기는 2 * 10 이라 20바이트 이고 (OK)

그러면 2바이트 2바이트 2바이트 2바이트 2바이트 2바이트 각각의 안에 a, b, c, d, e, f

이렇게 들어가서 총 6칸이겠네??

하는데

실제로는 7칸 필요함 => 마지막에 0 (NULL) 들어가야해서 -> 마침을 명시하기 위해.

NULL문자 즉, 0가 있어야 함. 이것까지 허용할 수 있는 공간이 있어야한다.

그래서

[7]이면 문제가 없는데

[6]일 경우 바로 문제가 생김.. ㅇㅎ...

7개를 6개에 집어 넣으려고하니까 문제가 생기는 거임

문자열 끝에 보이지 않는 0 까지 포함되는거 잊지말기

통한다

이런 초기화 방법은 문자 전용 자료형 애들한테만 통한다.

위아래 메모리 구조가 똑같다.

break 잡아서 보면 똑같음.

const wchar_t*

이거는 나는 당연스럽게 이해했다 -> 굿

포인터 타입을 wchar_t로 보겠다라는 것이고

배열의 이름은 그 시작 주소라서

L"abcdef"라는 문자열 (== 배열?) 이부분은 조금 애매한데 아무튼

배열의( 문자열의) 주소를 cwPtr이 "참조"를 하겠다

=> 배열의 시작주소를 L"abcdef"로 가지겠다. (a)

이렇게 출력하면 'a' 출력된다.

  1. 이해안가는 것은 const 붙이면 컴파일 에러 안나고 안붙이면 컴파일 에러 남
  2. 문자열이 배열이냐??

답이 뭐냐면

문자열이

지금 cwPtr에 입력이 될 수 있다는 것은

무슨 뜻이냐 하면은 문자열이 "주소값"를 반환하기 때문에 받을 수 있는 것이다.

문자열의 정체는?

"주소값"이다.

지금 L자가 붙어서 문자 하나하나를 2바이트로 보는데 이것이 지금 주소값을 반환을 하는데

주소값을 역참조 하려면 자료형이 일치를 해야한다.

그런데! int* ptrInt = & a; 이런것처럼 자료형이 매칭이 되어야하는데,

지금 wchar_t가 2바이트라서 매칭이 가능하다!!

wchar_t arr[10] = L"a, b ..";의미

는?

배열로 "복사"를 해오겠다라는 의미 이다.

문자열에 적혀있는 데이터를 그대로 "배열"로 옮겨 오겠다라는 의미이다.

차이점

wchar_t szWChar[10] = L"abcdef";

는 문자열의 값을 배열로 복사한 것이고

const wchar_t* pChar = L"abcdef";

는 Direct로 문자열의 주소값에 접근을 하는 것이다.

의도를 알아라

지금 szWChar[1] = 'z'는 b에다가 z로 바꾸어라 이고

pChar[1] = 'z';는

*(pChar + 1) = 'z' 아니냐?

pChar는 문자열의 시작 주소를 저장하고있다.

여기를 바꾸겠다라는 말이다.

코드는 어딘가에 있어야한다

const wchar_t* pChar에서

*(pChar + 1) = 'z';는

(스택이 왼쪽) 메인함수 스택에 포인터 변수가 있고,

내가 작성 해놓은 코드가 있다 "abcdef"라고있다. (어딘가에)

그 문자열의 시작 주소를 준 것이다.

코드도 메모리의 어딘가에 있다.

코드 = 프로그램이 실행시켜야할 명령어.

그런데 그 명령어 자체도 메모리상에 어딘가에 존재해야한다.

아이러니

명렁어 자체에 필요한 데이터가 있기 때문에 그걸 가리키는것.

근데 그곳을 수정?

그런데 코드가 있는 곳은

Read Only Momory라고 해가지고

실행도중에 당연히 절대 바뀌면 안되는 곳이다.

그래서

코드 안에서 작성된 문자열같은 데이터들은

나중에 따로 취합을 해서 특정 메모리 영역에 모아놓고 있다.

"읽기 전용" 메모리 라고 해가지고

코드상에 작성한 문자열들은 따로 관리가 되고있다.

그래서 이거 두개는 완전히 다르다

szWChar는 ROM에 있는 문자열을 배열로 스택메모리에 복사해서 접근하는 것이고

pChar[0] 는 ROM에 직접적으로 가서 접근 하는 것이다.

그래서

pChar[0] = 'z'

는 "에러"가 난다. ROM은 읽기 전용 (== 프로그램 실행 도중에 수정이 되면 안됨)

그래서!!!

지금 const 키워드를 붙여주는 이유가

const wchat_t* pChar = L"abcdef";

L"abcdef"이곳을 수정할 수 없게 하도록

const 포인터로 주소를 가져옴

const wchar_t *
내가 가르키고 있는 주소값을 const하겠다.

https://velog.io/@starkshn/CPP%EC%96%B4%EC%86%8C31-const-%ED%8F%AC%EC%9D%B8%ED%84%B0


(포인터 const)

다른 변수의 주소값을 받을 수 없다.
int* const ptr = nullptr;


그래서 아까 위에서

모른거 해석

  1. 이해안가는 것은 const 붙이면 컴파일 에러 안나고 안붙이면 컴파일 에러 남
  2. 문자열이 배열이냐??

1번에 => L"abcdef"의 반환타입이

문자열의 시작 주소를 줄 때 수정할 수 없는 포인터 타입으로 준다.

2번 => 문자열은 배열이 아니고 문자열의 시작 주소를 준다.

profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글