2013-07-05 2 views
-3

왜 첫 번째 코드는 작동하지만 두 번째 코드는 작동하지 않는지 알고 싶습니다. 문자열을 변수에 할당


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

int main() 
{ 
    char last[20], first[20], middle[20]; 
    char pres[20] = "Adams, John Quincy"; 
    char pres_copy[20]; 
    strcpy(pres_copy, pres); 

    last = strtok(pres_copy, ", "); 
    printf("%s", last); 

    first = strtok(NULL, ", "); 
    printf("%s", first); 

    middle = strtok(NULL, ", "); 
    printf("%s", middle); 

} 

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

int main() 
{ 
    char *last, *first, *middle; 
    char pres[20] = "Adams, John Quincy"; 
    char pres_copy[20]; 
    strcpy(pres_copy, pres); 

    last = strtok(pres_copy, ", "); 
    printf("%s", last); 

    first = strtok(NULL, ", "); 
    printf("%s", first); 

    middle = strtok(NULL, ", "); 
    printf("%s", middle); 

} 

나는 배열 이름은 포인터와 같은 생각했다. 그러나 컴파일러는 'char [20]' 유형과 'char *' 형식이 호환되지 않았기 때문에 구별을하고 있습니다.

두 가지 데이터 유형이 다른 이유는 무엇입니까?

+2

정확합니다. 배열에는 포인터가없는 동안 경계가 있습니다. –

+5

배열은 포인터가 아닙니다. 그게 다야. – soon

+1

이 링크도 확인하십시오. http://stackoverflow.com/questions/13667191/lvalue-required-error-when-trying-to-increment-array – VoidPointer

답변

2

배열은 포인터가 아닙니다. 배열에 포인터를 할당하려고합니다. 배열과 포인터에 대해서는 this C FAQ 항목을 참조하십시오.

0

'char [20]'및 'char *'유형이 호환되지 않습니다. char *char에 대한 포인터를 보유 할 수 있으므로 char이 아닌 char의 주소를 저장할 수 있습니다. char [20]은 20 자 (문자의 주소가 아님)의 배열입니다.

배열 이름을 사용하면 첫 번째 요소를 가리키는 포인터가됩니다. 인수로 인수 이름을 전달한다고해서 전체 배열이 전달되는 것은 아닙니다. 첫 번째 요소에 대한 포인터 일뿐입니다.

strtokchar *을 반환하므로 할당의 우 가치 값은 char *입니다.