문자 배열의 선언
char ch[10];
문자 배열의 초기화
-> 배열의 초기화는 {}를 사용했다.
-> 하지만 문자 배열의 초기화는 ""를 사용한다.
문자 배열은 배열 한칸 당 문자 하나씩 삽입이 된다.
마지막 문자가 삽입 된 후 다음 칸에는 자동으로 NULL문자가 삽입 된다.
NULL문자가 삽입되는 이유
-> NULL문자는 컴퓨터에게 해당 문자의 마지막 부분까지 읽으라고 명령을 하는 것이다.
예를 들어보자.
처음에 Hello라는 문자 배열을 선언하면 H, e, l, l, o 5개의 문자가 만들어진다.
여기서 H 부터 o까지 읽고 그 다음엔 NULL문자가 삽입이 된다.
NULL문자는 찾을 수 없을 경우 다음과 같이 알 수 없는 문구로 표시가 되는데,
원래는 빈 공간으로 표시가 된다.
배열의 이름은 주소이다.
-> cout 으로 배열의 이름을 전달하면 주소가 나온다.
-> 문자 배열은 같은 배열인데 주소가 나오는 것이 아니라 문자가 출력이 된다.
-> cout은 객체이다.
-> 단, 해당 주소가 char*일 경우에는 주소로 출력하는 것이 아닌 해당 주소에 있는 문자를 출력해준다.
문자 배열의 원소 접근
-> 배열처럼 인덱스 접근을 통한 읽기/쓰기가 가능하다.
char ch[30] = "Hello";
ch[2] = 'L';
cout << "\t" << ch[2] << endl;
cout << "\t" << ch << endl;
NULL문자의 중요성
-> 문자 배열의 크기를 설정할 때 NULL문자를 고려해서 크기를 설정해야된다.
예를 들어보자.
1byte 5개를 준비하고 6개의 문자를 넣으려고 시도한다.
이 경우 마지막에 들어갈 NULL문자는 할당한 메모리 공간이 아니다!!
-> 사용자가 할당하지 않은 메모리 공간의 접근 시도로 인해서 오류가 발생한다.
하지만 1byte 6개를 준비하고 Hello를 선언하면?
문제없이 잘 작동한다.
6byte로 만들어진 문자 배열 같은 경우는
첫 번째 문자부터 0, 1, 2, 3, 4, NULL 순서대로 읽으면 된다.
문자열 상수
-> 문자열 상수는 Data 영역에 할당이 된다.
(Data 영역에 배열의 형태로 공간을 만든다.)
-> 이후 문자 하나씩 대입하고, 마지막에는 NULL문자를 대입한다.
-> 메모리 할당이 완료되면 할당된 공간의 시작 주소를 반환한다.
cout << "Hello" << endl;
위에 Hello를 출력한 것은 Data 영역의 주소를 출력하는 것과 같은 말이다.
문자열 상수를 다루는 방법
-> 문자열 상수는 Data 영역의 주소를 반환하니, 주소를 저장할 변수를 만들어 사용한다.
char* ch = "Hello";
원소 접근
-> Data 영역에 등록된 문자는 상수의 성질을 가진다.
char* ch = "Hello";
ch[2] = 'L'; // 오류 발생
cout << ch[2] << endl;
문자 배열과 문자열 상수의 차이점
#1 문자 배열
-> const가 *(에스크리터) 뒤에 붙는 경우와 동일하다.
-> 역참조를 통한 값 변경은 가능
-> 배열의 이름은 상수포인터이기 때문에 주소 값 변경은 불가능
#2 문자열 상수
-> const가 *(에스크리터) 앞에 붙는 경우와 동일하다.
-> 역참조를 통한 값 변경은 불가능
-> 주소 값 변경은 가능
문자 배열의 초기화
-> 컴퓨터가 문자 배열의 선언과 동시에 초기화 시 문자를 하나하나 대입해준다.
char ch[10] = "Hello";
초기화 후 대입
-> ch는 주소를 가지는 포인터 변수
-> "Hello" 는 Data 영역의 주소
'Programming > C++ Basic' 카테고리의 다른 글
C++ 구조체(Struct) (0) | 2020.08.31 |
---|---|
C++ 문자열 함수 (0) | 2020.08.31 |
C++ 2차원 배열 (0) | 2020.08.28 |
C++ 배열과 포인터 (0) | 2020.08.28 |
C++ const와 포인터 (0) | 2020.08.28 |