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

时间:2012-07-01 15:42:40

标签: c++ c pointers

我之前读过一个因为与此

完全相同而被关闭的问题

When a function has a specific-size array parameter, why is it replaced with a pointer?

How to find the 'sizeof' (a pointer pointing to an array)?

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

  void foo(int a[5])

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

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

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

2 个答案:

答案 0 :(得分:15)

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

  

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

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

  

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

答案 1 :(得分:6)

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

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

正如您所看到的,它也在precedence的图表上。它也是不可重载的运算符之一。