繁体   English   中英

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

[英]Why does decay to pointer for array argument appear not to apply to sizeof()?

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

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

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

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

  void foo(int a[5])

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

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

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

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

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

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

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

sizeof是一个运算符,而不是一个函数。 这也是具体的一个。 如果它是一个表达式,则括号甚至不是必需的:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM