(1) 문자열
: C에서 문자열을 다루는 변수를 선언하려면 문자(char)의 배열로서 선언해야 한다.


#include<stdio.h>

int main()
{
   char strvar[10] = "abcdef";
   puts(strvar);

   return 0;
}


- C에서는 문자열의 마지막에 null(0) 값을 덧붙이는 방식을 사용하여 문자열의 끝을 판단합니다.
- 따라서 실제 문자 배열에 저장할 수 있는 문자수는 배열의 크기보다 하나가 적습니다.

   a    b     c     d     e     f   null    ...    ...    ... 


(2) 문자 포인터와 문자 배열
: '배열과 포인터'부분에서 배열은 포인터로 대체할 수 있다고 하였다. 따라서 '문자의 배열'역시 '문자의 포인터'로 대체
  할 수 있다.


#include<stdio.h>

int main()
{
   char *strvar = "abcdef";
   puts(strvar);

   return 0;
}


- 다음과 같이 strvar문자배열을 '*'를 붙여 포인터 문자 배열로 수정해도 결과는 같다.

하지만!!


#include<stdio.h>

int main()
{
   char *strvarA;
   char strvarB[10];

   strvarA = "abcdef";
   strvarB = "abcdef";

   return 0;
}

- 다음과 같은 경우 strvarB = "abcdef"; 부분에서 에러가 발생한다.
- 변수 선언시에 초기값으로 바로 대입하면 에러가 발생하지 않는데, 선언 이후에 대입 하려고 하면 에러가 발생한다.

이유는!
- C에서 " "로 둘러쌓인 문자열 리터럴의 타입이 바로 char* 이다. 즉 문자열 리터럴 자체가 문자의 포인터로 구현되어 있는 것.
- 따라서 같은 포인터 타입 변수인 strvarA에 대해서는 바로 대입이 가능하지만, 배열 변수에 포인터 값을 할당하는 것은 불가능 하다.
- 배열은 항상 자신의 첫번째 원소(arr[0])에 대한 주소값을 기억하고 있어야하고, 변경할 수 없는 상수형 포인터 이기 때문이다.


배열에 문자열을 대입하기 위해서는 복사(COPY)를 하면 된다.


#include<stdio.h>
#include<string.h>

int main()
{
   char *str[10];

   strcpy(str, "abcdef");
   puts(str);

   return 0;
}

- char*형 변수에 대해서도 마찬가지로 strcpy() 함수를 통해 복사하는 방식으로 대입할 수 있다.



※ 참고자료 : http://2xx195.tistory.com/category/Programming/C?seq=6

'P rogramming > C Language' 카테고리의 다른 글

문자열 변수와 문자열 상수  (1) 2011.10.27
typedef - 자료형의 치환  (0) 2011.10.26
2차원 배열과 포인터 이론  (4) 2011.10.26
1차원 배열과 포인터 이론  (0) 2011.10.26
포인터 이론  (0) 2011.10.26
by 민트앤라떼 2011. 10. 26. 14:36