6

整数配列に値を格納するために&演算子を入れる必要があるのに、char配列に文字列を格納する必要があるのはなぜですか?scanf()

int a[5];
for(i=0;i<5;i++)
scanf("%d",&a[i]);

しかし

char s[5]; scanf("%s",s);

配列は最初の要素へのポインタであるため、値を格納する場所のアドレスを渡す必要があります。したがって、int / float配列の場合、基本的にはを意味し(a+i)ます。

しかし、文字列の場合はどうでしょうか?

4

5 に答える 5

8

scanf は、値を入れるものへのポインターを受け入れます。最初のインスタンスでは、整数配列の位置 i にある特定の int への参照を渡しています。2 番目の例では、配列全体を scanf に渡しています。C では、配列とポインターは同義であり、同じ意味で (一種の) 使用できます。変数 s は、実際には 5 文字分の連続スペースを持つメモリーへのポインターです。

于 2010-08-09T13:30:02.447 に答える
3

sizeof式で配列の名前を使用すると (オペランドまたはアドレス演算子を除く&)、その配列の最初の項目のアドレス、つまりポインター値に評価されます。つまり&、アドレスを取得する必要はありません。

式で int (または short、long、char、float、double など) を使用すると ( or のオペランドとしては除くsizeof) &、そのオブジェクトの値に評価されます。アドレス (つまり、ポインター値) を取得するには、 を使用してアドレスを取得する必要があり&ます。

于 2010-08-09T13:53:23.560 に答える
1

scanf("%d", a + i )も動作します。

%d何を期待するかを%s伝えるだけですが、どちらの場合もアドレスが必要ですscanf

C では、配列とポインタは関連しています。

%s文字配列に収まるかどうかは関係なく、終了scanfする文字列を期待するように指示するだけです。\0scanf

于 2010-08-09T13:28:47.083 に答える
-2

文字配列は既にポインターであるためです。

C 配列は、スタックに割り当てられた量の RAM へのポインターと考えることができます。配列のインデックス付けの代わりに、ポインター操作を使用することもできます。*aどちらも同じ結果をa[0]生成します (配列の最初の文字を返します)。

于 2010-08-09T13:29:28.047 に答える