0

scanf で int には & が必要なのに、char には必要ないのはなぜですか?

  int main ()
     {
        char str [80];
        int i;

        printf ("Enter your family name: ");
        scanf ("%s",str);  
        printf ("Enter your age: ");
        scanf ("%d",&i);

        return 0;
    }
4

4 に答える 4

1

標準ライブラリ関数scanf()は、読みたいデータに対応するポインタを期待しています。したがって、常にポインターを渡す必要があります。

の場合char[]、配列名は配列の最初の要素へのポインターに分解されます。これが&、char 配列に使用しない理由です。&実際、 scanf() に渡すときに char 配列にアンパサンド ( ) を使用することは、 のタイプが&charArrayis であるのに対し、scanf() はフォーマット指定子 にa をchar (*)[N]期待するため、間違っています。char*%s

ポインタがある場合は、単純に直接渡すことができます。例えば

int *p;
char *c;
p = malloc(sizeof(int)); // one int
c = malloc(100); // 100 bytes  
scanf("%d%99s", p, c);

上記のように&、引数は既にポインターであるため、ここでは使用しません。使用すると、&ポインターへのポインターになるため、間違っています。

したがって&、scanf() への引数が、読み込みたい型のオブジェクトへのポインターでない場合は常に使用します。

于 2013-08-10T23:57:59.207 に答える
1

scanf()データをスキャンするポインタ (メモリ アドレス) が必要です。strは文字の配列ですが、式で (たとえば、scanf の引数として) 使用される場合、実際strには最初の要素のメモリ アドレスを意味します。ただし、 の場合は、そのメモリ アドレスを使用するintように明示的に指示する必要があります。これが、 (address-of) 演算子を使用する理由です。scanf()&

于 2013-08-10T23:31:44.223 に答える
0

str配列であるため、ポインターに減衰します(したがって、最初の要素を指します。これは、配列とポインターが同じであることを意味しません)。には値を格納するアドレスが必要なiので&、のアドレスが必要です。scanfi

于 2013-08-10T23:24:54.823 に答える