C언어는 문자를 배열로 다룬다.
문자열은 말그대로 문자들의 나열이다.
이곳에서 주로 다룰 내용은 기초적인 내용보다는, 공부를 해나가면서 상식적(자연스럽게)으로 이해하기 힘든내용을 요약정리해두겠다.
배열의 기본 문법은 안다는 전제하에 설명을 하겠다.
배열로 문자열를 다루는 법
일반적인 설명보다는, 예를 들어설명하겠다.
char a='a'; // 문자를 다루는 '따옴표다 문제없이 a변수에 a가 입력된다.
char a="a"; // 에러가난다 a를 "로묶어놨기때문에 문자열로 인식한다. 이상태에서에러가 안나게 고치려면?
char*a="a"// 문자열로 인식하고 에러가 안 난다.
그럼 왜 포인터로 선언하면 에러가 안나는걸까. C에서는 String형이 없다. 위와같이 char 형이다.
그래서 C에서는 문자열 인식 메커니즘이 문자열의 시작점을 주소로 반환하는 형태이기때문에 (문자열은 끝에는 \0이온다.) 포인터형이다.
char arr[10]="test" // 에러가 안난다. 문자열과 배열은 아주 밀접한 관계가있다.
char arr[10]={"test","what"}; //에러가 난다.
char *arr[10]={"test","what"} //에러가 안 난다.
에러가 나는 이유는 문자열 자체는 1차원 배열과 마찬가지이다. 그런데 1차원 배열은 1개인데 문자열은 2개가 대입되었다. 하나의 배열공간은 char형으로 1바이트인데 문자열은 최소 1바이트이므로 이런 대입은 불가능하다.
그 다음 포인터 선언을 하니 에러가 없어졌다. 간단히 말해서 포인터 선언을 하므로서 문자열을 저장할수 있는 공간을 10개로 만들어 버렸기 때문에다. 하나의 배열요소는 하나의 포인터가 된 셈이다.
메커니즘만 잘 파악하면 배열에 포인터 선언을 보고 겁먹을 필요는 없을 것이다.
수정: 현재 줄친 표현은 최신 C++컴파일러상에선 deprecated conversion from string constant to char* ~~
이렇게 에러가 난다.
예전에 이런 형식이 가능했다는것이 에러를 발생할 소지가 있었다는것은 알고 있었다.
결국 컴파일러상에서 이런표현을 에러로 고쳤나보다.
<gcc 버전 4.8.1>