문자열 표현의 두 가지 형태
문자열을 표현하는 방식에는 두 가지 방법이 있다.
첫번째는 '변수 형태의 문자열'로 배열에 문자열을 저장하는 방법이다.
char str[] = "Hello world";
"Hello world"라는 문장을 배열에 저장하는 방식으로
str에는 문장의 첫글자인 H의 주소값이 저장된다.
이는 배열에 저장된 형태이므로 값의 변경이 가능하다.
그러나 str은 항상 H의 위치를 가리키고 있어야 하므로 가리키는 위치는 변경할 수 없다.
두번째 방법은 '상수 형태의 문자열'로 포인터를 이용해 저장하는 방법이다.
char * str = "Hello world";
이는 char형 포인터 변수에 메모리 공간 어딘가에 저장된
Hell world라는 문자열의 주소값을 저장하는 방법이다.
이 방식은 문자열이 상수형태로 저장되기 때문에 문자열의 내용을 변경할 수 없다.
그러나 str은 문자열이 저장된 공간의 주소를 가리키고 있기 때문에
str이 가리키는 값은 변경이 가능하다.
예를 들어 "Hello world"를 가리키는 포인터를 "Good morning"이라는 문자열을 가리키도록 변경한다면
char * str = "Hello world";
str = "Good morning";
printf("%s", str);
위처럼 쓸 수 있다.
str은 "Hello world"가 아닌 "Good morning"이 저장된 메모리의 주소를 가리키게 되는 것이다.
char str1[] = "Hello world";
char * str2 = "Hello world";
str1[0] = 'B';
str2[0] = 'B';
printf("str1 = %s \n", str1);
printf("str2 = %s \n", str2);
위 코드는 상수 형태의 문자열은 변경이 불가하다는 것을 나타낸다.
변수 형태의 문자열과 상수 형태의 문자열을 선언 후 각 문자열의 첫글자를 'B'로 변경한다.
배열 형태인 str1은 수정이 가능하므로 에러가 발생하지 않지만
포인터인 str2는 상수 형태의 문자열이므로 수정이 불가하여 문제가 발생한다.
문자열
큰 따옴표로 묶인 문자열은 해당 문자열을 메모리 공간에 저장 후
문자열의 첫 문자가 저장된 주소값을 반환한다.
예로 printf를 사용해 문자열 저장 시
printf("yeoon");
메모리에 "yeoon"이라는 문자열이 저장되고 해당 문자열이 저장된 주소를 반환한다
문자열이 123456이라는 주소에 저장되었다고 한다면
printf(123456);
위와 같은 모양이 되는 것이다.
결국 printf 함수는 매개변수로 받은 문자열을 바로 출력하는 것이 아니라
문자열이 저장된 후 반환된 주소값에 해당하는 내용을 출력하는 것이다.
'C' 카테고리의 다른 글
C 공부 10일차 Chapter 14 함수와 포인터 (0) | 2022.09.15 |
---|---|
C 공부 9일차 Chapter 13 포인터 배열 (0) | 2022.09.14 |
C 공부 7일차 Chapter 13 (0) | 2022.09.12 |
C 공부 6일차 Chapter 13 (0) | 2022.09.10 |
C 공부 5일차 Chapter 12 (0) | 2022.09.09 |