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 运算符或一元 & 运算符的操作数,或者是用于初始化数组的字符串字面量,否则类型为 "array of type" 的表达式将转换为类型为“类型指针”的表达式,它指向数组对象的初始元素并且不是左值。”

请注意,对于 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 

如您所见,它也在此优先级图表上。它也是不可重载的运算符之一。

于 2012-07-01T15:43:49.420 回答