프로그래밍/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>

반응형