2

非常に一般的な質問があります。ファイルに文字配列を書き込もうとしたときに、コードを次のように書きました。

fwrite(array[10],1,10,file_ptr)

そしてコンパイラは警告を投げましたargument 1 makes from integer to pointer without a cast.

次に、行を次のように変更しました

fwrite(&array[10],1,10,file_ptr)

警告はもう表示されません。

質問:コンパイラはアドレスと値をどのように区別しますか?の値array[10]が適切なアドレスに似ている場合はどうなりますか?

4

5 に答える 5

4

10文字の配列がある場合、つまり

char array[10];

次に、その配列の11 番目array[10]の要素にアクセスします。

配列変数を渡すだけで、ポインターとして機能します。

fwrite(array, 1, 10, file);
于 2013-02-26T08:18:42.177 に答える
1

C は静的に型付けされた言語です。あなたが書くたびに

char array[100];

array100 文字の配列であるとC コンパイラに伝えています。次に、それがarray[10]文字であり、それ&array[10]が文字へのポインターであることを認識します (a char *)。

fwriteただし、 は、最初のパラメーターとして a を取るconst void *、つまり型指定されていないポインターとして定義されます。ポインターではないものを渡すと、コンパイラーはこれを認識して文句を言います。

C コンパイラは、値に基づいて何かの型を「推測」しようとしません。

于 2013-02-26T08:18:35.800 に答える
1

array[10]配列全体を指定しているという印象を受けているようですが、そうではありません。array存在しないの 11 番目の要素を指定します ( として宣言した場合some_type array[10])。

配列全体を書きたいと言うので、 fwrite() に の最初の要素のアドレスを渡す必要がありますarray。これはたまたまarray(または&array[0]) です。C では、式で使用された場合の配列の名前であるため、最初の要素のアドレスです (sizeof演算子を除く)。

intコンパイラは、配列の型と要素の型に関する完全な情報を持っているため、ポインターが必要な場所に型の式が記述されていることを検出できます。

配列識別子を使用するだけで、サイズや要素の種類に関係なく、完全な配列を fwrite() する方法があります。

fwrite (array, sizeof *array, sizeof array/sizeof *array, file);

wheresizeof *arrayは要素のサイズにsizeof array/sizeof *array評価され、配列内の要素の数に評価されます。これは配列に対してのみ機能し、ポインターに対しては機能しないことに注意してください。同じことが達成できます

fwrite (array, sizeof array, 1, file);

また

fwrite (array, 1, sizeof array, file);

どちらを好むかは主にスタイルの問題です。それらはすべて同等であり、同じ速度で実行されます。

于 2013-02-26T08:42:30.473 に答える
1

の署名fwrite()は :fwrite(const void *ptr, size_t size, size_t count, FILE *fptr)です。

fwrite()アドレス(またはアドレスを保持するポインター変数、別名ポインター)を期待しており、 a[10]文字ではありませんが、ポインターではなく文字です。これが警告の理由です!

&a[10] アドレスであり、 の最初の引数として有効ですfwrite()。したがって、警告はスローされません。


情報を保持する方法は、レクサーとパーサーの組み合わせと、「シンボル テーブル」と呼ばれるテーブルのセマンティック アナライザーにあります。

-- 質問の編集後 --

fwrite(&array[10],1,10,file_ptr)<- 引数-1 は、11 番目の位置から始まる文字列として解釈されますarray

于 2013-02-26T08:21:25.717 に答える
0

array [10]の値が適切なアドレスに似ている場合はどうなりますか?

その場合、配列型はでありint (*)[n]、ではありませんint [n]。これが私たちが型システムを持っている理由です。

于 2013-02-26T09:01:56.423 に答える