문자열(string)이란, 알파벳 하나하나가 메모리상의 연속적으로 나열되며, 마지막에는 '\0' (NULL)으로 끝나는 배열이다.
위 그림과 같이 문자열을 만드는 방법은 아래와 같다.
char string[11] = "hello world";
char이므로 한칸당 1byte를 사용하며, "~~"문자열 맨 뒤에 \0 (NULL)문자는 자동으로 들어가게 된다.
고로 띄어쓰기를 포함한 모든 문자들 공간과 마지막의 NULL이 들어갈공간을 포함해 11개의 공간을 선언했다.
C언어로 문자열을 표현하는 방법은 대표적으로 배열선언과 포인터 선언이 있다.
배열도 "상수형 포인터"로 결국 포인터와 동일한 역할을 한다. (아래 참고.)
https://ansan-survivor.tistory.com/1249
<배열으로 문자열 선언>
배열으로 선언하는 방법은 메모리공간을 미리 할당하는 방법과, 컴파일러가 문자열 길이를 보고 알아서 할당시켜주는 방법이 있다.
// 배열로 선언하는 방법. 메모리를 미리 할당함.
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' 이런식으로 포인터로 값을 변경할 수 없다. 상수이기 때문에.
(배열로 선언하고 내부인자 변경가능)
#include <stdio.h>
int main()
{
// 배열으로 문자열 선언
char str1[] = "hello world";
// 배열으로 선언한 문자열 내부인자는 변경 가능
printf("변경전: %s\n", str1);
str1[1] = 'k';
printf("변경후: %s\n", str1);
return 0;
}
(포인터로 선언하고 변경을 원할 시, 다른 문자열 주소를 넣어주어야 한다.)
#include <stdio.h>
int main()
{
// 포인터로 문자열 선언
// "hello world" 문자열은 상수형태로 변경 불가.
char * str2 = "hello world";
printf("변경전: %s\n", str2);
// 문자열을 바꾸고 싶은경우 다른 문자열을 선언해야 함.
str2 = "declare other string !";
printf("변경후: %s\n", str2);
return 0;
}
메모리 어딘가 상수형으로 선언된 문자열을 기존의 것은 버리고, 새로 변경된 문자열의 앞자리인 'd'를 가리키게 된다.
* 위 포인터 원리와 동일하게 만약 아래와같은 printf함수를 선언하면 이는 메모리 어딘가에 상수형 문자열을 만드는것과 동일하다.
즉, 메모리 어딘가 "hi nice to meet you" 라는 상수형 문자형을 할당하고, 이를 첫글자의 메모리 주소로 치환한다.
printf("hi nice to meet you");
즉 만약 첫글자의 'h' 의 문자열 주소가 0x0123 이라면, 컴퓨터가 이해하는 것은 아래와 같다.
printf(0x0123)
<여러 문자열을 품고있는 배열 포인터 선언>
https://ansan-survivor.tistory.com/1252
'C언어 \ C++ > 포인터 \ 배열' 카테고리의 다른 글
[C언어] 변수 값 바꾸기 Swap 예제 (포인터 예제 포함) (0) | 2022.02.06 |
---|---|
[C언어] 배열 내에 여러 문자열 저장하기, 출력하기 (0) | 2022.02.06 |
[C언어] C언어 배열을 포인터로 변환하기 (배열을 포인터로 바꾸기) (0) | 2022.02.05 |
[C언어] C언어 배열과 포인터의 관계 (변수형 포인터, 상수형 포인터), 포인터로 배열 변경하기 (0) | 2022.02.05 |
[C언어] 포인터 변수의 초기화 선언 (잘못된 사용시 위험성) (0) | 2022.02.05 |