문자열(string)이란, 알파벳 하나하나가 메모리상의 연속적으로 나열되며, 마지막에는 '\0' (NULL)으로 끝나는 배열이다.
위 그림과 같이 문자열을 만드는 방법은 아래와 같다.
char string[11] = "hello world";
char이므로 한칸당 1byte를 사용하며, "~~"문자열 맨 뒤에 \0 (NULL)문자는 자동으로 들어가게 된다.
고로 띄어쓰기를 포함한 모든 문자들 공간과 마지막의 NULL이 들어갈공간을 포함해 11개의 공간을 선언했다.
C언어로 문자열을 표현하는 방법은 대표적으로 배열선언과 포인터 선언이 있다.
배열도 "상수형 포인터"로 결국 포인터와 동일한 역할을 한다.
<배열으로 문자열 선언>
배열으로 선언하는 방법은 메모리공간을 미리 할당하는 방법과, 컴파일러가 문자열 길이를 보고 알아서 할당시켜주는 방법이 있다.
// 배열로 선언하는 방법. 메모리를 미리 할당함.
char string[11] = "hello world";
// 배열로 선언, 메모리 공간은 컴파일러가 알아서 할당 함.
char string[] = "hello world";
<포인터로 문자열 선언>
포인터로 선언하는 방법은 아래와 같이 간단하다. 하지만 여기서 string 이라는 변수는 포인터변수로 선언되었기에 주소값을 저장할 수 있다. 저 주소값은 문자열의 첫번째 항을 가리킨다. 즉, 아래 h문자를 가리키고 있다.
하지만 배열의 문자열 선언과 다른점은 "hello world"라는 문자열은 메모리 어딘가에 선언이 되었는데, 이는 상수형 문자열 특성을 지니므로 마음대로 문자하나하나를 변경할 수 없다.
char* string = "hello world";
원리는 아래 순서를 따른다.
1. 메모리 어딘가에 "hello world"가 할당된다.
2. char * string 변수가 선언된다.
3. string은 h의 주소값을 가리킨다. ( *string = 'h' )
포인터 변수 string은 h의 주소를 가리키므로 *string를 출력하면 'h'가 출력되고, (*string + 1)으로 출력하면 그 뒤에 있는 문자인 'e'가 출력된다. 단 "hello world" 전체는 상수형으로 할당되었기 때문에 임의로 배열을 변경할 수 없다.
다시말해 *string = 'k' 이런식으로 포인터로 값을 변경할 수 없다. 상수이기 때문에.
'프로그래밍 언어 > C++' 카테고리의 다른 글
[C++] emplace_back 과 push_back 의 차이 (0) | 2023.09.19 |
---|---|
[C] 배열과 포인터의 관계 (변수형 포인터, 상수형 포인터), 포인터로 배열 변경하기 (0) | 2023.09.17 |
[C] 문자열(string) 입출력 (puts, fputs, gets, fgets) 사용법 (0) | 2023.09.17 |
[C] open, close, read 함수에 대하여 (0) | 2023.09.17 |
[C] 이스케이프 문자(Escape Character) (0) | 2023.09.16 |