8

これとまったく同じであるために閉じられた質問を以前に読みました

関数に特定のサイズの配列パラメーターがある場合、なぜポインターに置き換えられるのですか?

「sizeof」(配列を指すポインター) を見つける方法は?

しかし、これを読んだ後でも、 sizeof() がどのように機能するかについてまだ混乱しています。次のような関数に引数として配列を渡すことを理解しています

  void foo(int a[5])

配列引数がポインターに減衰します。上記の2つの質問リンクで見つけられなかったのは、sizeof()関数自体がこのポインター減衰動作から免除されている(または少なくとも一見免除されているように見える)理由についての明確な答えでした。sizeof() が他の関数と同じように動作する場合

   int a[5] = {1,2,3,4,5};
   cout << sizeof(a) << endl;

4の代わりに上記が出力され20ます。これは、ポインターの動作への減衰の矛盾であるように思われるため、明らかなことを見逃しましたか??? これを再び持ち出して申し訳ありませんが、何年にもわたってこの機能をあまり考えずに喜んで使用してきたにもかかわらず、なぜこれが起こるのかを理解するのに本当に苦労しています.

4

2 に答える 2

16

標準がそう言っているので(私の強調):

(C99、6.3.2.1p3) " sizeof演算子またはunary&演算子のオペランドである場合、または配列を初期化するために使用される文字列リテラルである場合を除き、「タイプの配列」タイプの式は、配列オブジェクトの初期要素を指し、左辺値ではない「タイプへのポインタ」タイプの式。

C ++の場合、標準ではサイズは配列のサイズであると明示的に示されていることに注意してください。

(C ++ 11、5.3.3p2 sizeof) "[...]配列に適用すると、結果は配列の合計バイト数になります。これは、n個の要素の配列のサイズがn倍であることを意味します。要素のサイズ。」

于 2012-07-01T15:46:52.907 に答える
7

sizeofは演算子であり、関数ではありません。それもまた特定のものです。式の場合、括弧は必要ありません。

int a;
sizeof (int); //needed because `int` is a type
sizeof a; //optional because `a` is an expression
sizeof (a); //^ also works 

ご覧のとおり、この優先順位表にも記載されています。これは、オーバーロードできない演算子の1つでもあります。

于 2012-07-01T15:43:49.420 に答える