8

C コードを見てからしばらく経ちましたが、ここで何が起こっているのかを理解しようとしています。誰かがこれを宣言しました (コード内により多くのメンバーがあります):

int trysizes[] = { 64, 64, 128, 64, };

その後、これを for ループの一部として使用します。

sizeof(trysizes)/sizeof*(trysizes)

最初の部分は配列内のバイト数であり、2 番目の部分は配列内の項目数を示す各配列メンバーのサイズでなければならないと考えています。これは配列の長さを計算する標準的な方法ですか?2番目の sizeof は実際に何をしていますか?

4

3 に答える 3

15

はい、紛らわしい構文を修正した後、これは次のようになります

sizeof(trysizes)/sizeof(*trysizes)

またはさらに良い

sizeof(trysizes)/sizeof(trysizes[0])

これは、配列の要素数を計算するための推奨される方法です。2番目sizeofは実際に配列の要素のサイズを計算します0

trysizesこれは、配列へのポインターではなく、実際に配列である場合にのみ機能することに注意してください。

于 2012-07-27T21:21:26.277 に答える
1

了解しました。sizeof分母の 2 番目は、配列の最初の要素を逆参照し、 element のサイズを生成します0sizeof配列変数の合計バッファ サイズ (分子) を知っているため、このイディオムは配列内の要素の数を生成します。

私の経験では、これはこの特定のイディオムの珍しい表現であり、通常私が見たものであり、次のように使用します

sizeof(var)/sizeof(var[0]);

これにより、変数がポインターではなく配列としてより明確に識別されます。

これはかなり一般的なトリックですが、変数が配列として宣言されている場合にのみ機能することに注意してください。たとえば、関数パラメーターとしてポインターに変換された配列では機能しません。

于 2012-07-27T21:21:48.483 に答える
1

重要な点は、 sizeof を使用する場合、ほとんどの場合 を使用int a; sizeof(a);しますが、次のように括弧を省略することもできるということです:int a; sizeof a;
したがって、この場合、sizeof*(trysizes) == sizeof *trysizes == sizeof(*trysizes)

于 2012-07-28T03:05:19.367 に答える