2017-04-16 1 views
-3

아래 코드에서 배열이 함수의 인수로 전달 될 때 배열의 첫 번째 요소를 가리키는 포인터가되므로 왜 우리는 역 참조 할 수 없습니까? 내가 사용하는 경우배열 이름에 간접 연산자를 사용할 수없는 이유는 무엇입니까?

#include <stdio.h> 
int main(void) { 

    char s[] = "radha"; 
    int a[2] = {0,1}; 
    printf("%s ", *s); 
    printf("%d", *a); 
    return 0; 
} 

나는 위의 코드 세그먼트 오류를 ​​얻고, 무슨 이유가 여기에 A * (A + 0), 그래서 단순히의 문제가 무엇으로 [0], 그것은 내부적으로 변환됩니다 * a 또는 * S를 할 때는 명확히하십시오.

+3

'의 printf ("%의 S"* S)'-> '의 printf ("%의 S', S) ' –

+4

'* s' == '에서 S [0]'==' r''. 'printf ("% s", s); 또는 printf ("% c", * s);' – BLUEPIXY

+1

끔찍한 질문 제목, 당신은 더 좋은 것을 생각해야합니다. –

답변

3

나는 당신의 두 제안,

  1. 설명서를 읽고 있습니다.

    • "%s" 지정은 char의 포인터, 당신이 정의되지 않은 동작을 일으키는 포인터 인 것처럼 다음 정수 및 역 참조 간주됩니다 char을 전달하는 것으로 기대하고있다.

    당신이 문서를 읽고, char[]이 잘못된 이유도 char * poitner를 역 참조하는 당신에게 char를 줄 것이다, 당신은 이해할 char *로 변환되는 것을 이해합니다.

  2. 컴파일러 경고를 활성화합니다. 그렇게하면 잘못된 유형을 전달하고 있음을 알리는 경고로 인해 많은 시간을 절약하고 주어진 함수를 호출하는 방법에 대해 더 많이 배울 수 있습니다.

    경고를 무시하면 더욱 심각합니다. 컴파일러가 무언가에 대해 불평 할 것이라는 것을 미리 알지 못한다면 경고를 무시해서는 안됩니다. 경고가 예상되지 않으면 오류가 발생할 가능성이 큽니다.

+0

함수 프로토 타입에서 char str [] 및 char * str을 사용하면 어떤 차이가 있는지 설명 할 수 있습니까? – stackuser

+3

함수 호출의 경우에는 차이점이 없습니다. 그 이유는'char []'가 함수 매개 변수로 전달 될 때 자동으로'char *'로 변환되기 때문입니다. –

7

printf("%s ",*s);char 'r'을 전달하는 동안 두 번째 인수가 문자열에 대한 포인터가 될 것으로 예상합니다 (역 참조 s은 예상대로 첫 번째 배열 항목을 제공합니다).

관련 문제