문자 배열의 선언

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

+ Recent posts