c에서 문자열을 표현하는 방법은 크게 세 가지가 있다.
char a[10] = "hello a";
char b[] = "hello b";
char *c = "hello c";
a와 b는 배열을 이용해서 표현하고 있다는 것은 알겠는데, c는 뭘까?
사실 문자열은, 그 문자열이 시작되는 주소를 가리킨다.
또한 배열은, 그 배열이 시작되는 주소를 가리킨다.
그러니까, 위 코드의 세 번째 라인의 코드의 경우, “hello c”라는 문자열의 시작주소를 포인터 변수 c에 할당한 것이다.
어, 그럼 반대로 배열 a에 문자열의 시작주소를 넣으면 컴파일 에러가 떠야하는거 아닌가요?
맞다.
char a[10] = "hello a";
a = "change"; // compile error
문자열 a는 &a[0]과 같다. 즉, 문자 배열의 시작 주소를 가리키고 있는데, 이 주소를 마음대로 다른 문자열 주소를 가리키게 할 수는 없는 것이다.(포인터 문자열은 가능)
다만, 선언과 동시에 초기화를 할 경우에는, 각각 배열의 요소를 초기화하는 식으로 이루어지기 때문에, char a[10] = “hello a”와 같은 코드가 가능한 것이다.
char a[10] = "hello a";
char *c = "hello c";
a = c; // compile error
c = a; // 정상적으로 동작함