int age;
char name[10];
scanf("%d", &age);
scanf("%s", name);
最初のscanf
関数では'&'
年齢の前にシンボルを使用しますが、2番目の関数
ではchar配列であるscanf
ため使用しません。'&'
なぜそうなのか誰か教えてもらえますか?
配列はすでにアドレスとして渡されているのに対し、整数変数は渡されていないためです(したがって、そのアドレスは&
address-of演算子を介して明示的に渡される必要があります)。
配列名自体は、メモリ内のその配列の先頭を参照します。この場合:
name == &name[0]
ほとんどの状況では、型 "N-element array of T
" の式は ("decay") 型 "pointer to T
" に変換され、式の値は配列の最初の要素のアドレスになります。
あなたが書くとき
scanf("%s", name);
式のname
型は「10 要素配列char
」です。上記の規則により、型「へのポインタ」に変換されchar
、その値は と同じ&name[0]
です。そのscanf
ため、配列値ではなくポインター値を受け取ります。
この規則の例外は、配列式がsizeof
、_Alignof
、または単項演算子のオペランドである場合、または&
宣言で別の配列を初期化するために使用される文字列リテラルである場合です。
式name
と&name
は同じ値(配列の最初の要素のアドレスは配列のアドレスと同じ) を返しますが、それらの型は異なることに注意してください。name
typechar *
を&name
持ちますが、 type char(*)[10]
、または「の 10 要素配列へのポインター」を持ちchar
ます。