为什么衰减到数组参数的指针似乎不适用于sizeof()?

mat*_*975 7 c c++ pointers

我之前读过一个因为与此完全重复而被关闭的问题

当函数具有特定大小的数组参数时,为什么它被指针替换?

如何找到'sizeof'(指向数组的指针)?

但读完之后我仍然对sizeof()的工作原理感到困惑.我理解将数组作为参数传递给函数,如

  void foo(int a[5])
Run Code Online (Sandbox Code Playgroud)

将导致数组参数衰减为指针.我在上面的2个问题链接中找不到的是一个明确的答案,为什么sizeof()函数本身免于(或至少看似豁免)这个指针衰减行为.如果sizeof()表现得像任何其他函数那么

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

然后上面应该输出4而不是20.我是否错过了一些明显的东西,因为这似乎与指针行为的衰退相矛盾?很抱歉再次提起这个问题,但我真的很难理解为什么会发生这种情况,尽管多年来一直很愉快地使用这个功能而没有真正考虑它.

oua*_*uah 15

因为标准这样说(强调我的):

(C99,6.3.2.1p3)" 除非它是sizeof运算符或一元&运算符的操作数,或者是用于初始化数组的字符串文字,否则将类型为"array of type"的表达式转换为带有"指向类型的指针"类型的表达式,它指向数组对象的初始元素,而不是左值."

请注意,对于C++,标准明确指出大小是数组的大小:

(C++ 11,5.3.3p2 sizeof)"[...]当应用于数组时,结果是数组中的总字节数.这意味着n个元素的数组大小是n倍的n倍.元素的大小."


chr*_*ris 6

sizeof是一个操作员,而不是一个功能.这也是具体的一个.如果它是一个表达式,则括号甚至不是必需的:

int a;
sizeof (int); //needed because `int` is a type
sizeof a; //optional because `a` is an expression
sizeof (a); //^ also works 
Run Code Online (Sandbox Code Playgroud)

如您所见,它也在这个优先级图表上.它也是不可重载的运营商之一.