프로그래밍/C언어

배열과 문자열의관계 C언어

콘파냐 2013. 4. 29. 19:25

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>

반응형