2017-04-16 3 views
-3

以下のコードでは、配列が関数の引数として渡されたときに配列の最初の要素へのポインタになるので、なぜそれを逆参照できないのでしょうか?なぜ配列名で間接演算子を使用できないのですか?

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

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

私は上記のコードのためのセグメンテーションフォールトを取得しています、私が使用している場合、[0]、それは内部的に*(A + 0)として変換され、ここに理由何なので、何が単純で問題です* aまたは* Sをして、明確にしてください。

+3

'のprintf( "%sの" * S);' - > 'のprintf( "%sの"、S);' –

+4

'* S' =='のS [0] '== '」 r''。 'printf("%s "、s);'または 'printf("%c "、* s);' – BLUEPIXY

+1

ひどい質問のタイトルです。 –

答えて

3

私はあなたの2つの提案を持って、

  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'を渡している間に2番目の引数が文字列へのポインタになることを想定しています(逆参照sは、最初の配列項目を期待通りに提供します)。

関連する問題