传递数组名称时sizeof如何工作

时间:2018-08-11 16:23:42

标签: c pointers sizeof

为什么sizeof(array_name)是数组的大小,为什么sizeof(&a [0])是指针的大小,即使将数组名传递给函数时,传递的是数组开头的位置数组。

2 个答案:

答案 0 :(得分:2)

在大多数表达式中,使用数组时,它会自动转换为指向其第一个元素的指针。

sizeof有一条特殊规则:当数组是sizeof的操作数时,它不会自动转换为指针。因此,sizeof array_name给出数组的大小,而不是指针的大小。

此规则也适用于一元&运算符:&array_name是数组的地址,而不是指针的地址。

此外,如果数组是用于初始化数组的字符串文字,则不会将其转换为指针。字符串文字用于初始化数组。

此规则是C 2018 6.3.2.1 3:

  

除非它是 sizeof 运算符或一元运算符的操作数,或者是用于初始化数组的字符串文字,否则其类型为“ 类型的数组”将转换为类型为“指向 type 的指针”的表达式,该表达式指向数组对象的初始元素,而不是左值。如果数组对象具有寄存器存储类,则该行为是不确定的。

答案 1 :(得分:0)

函数的数组参数不存在。它们变成指针(如果数组是多维的,则最里面的索引会指向指针)。它只是从B语言继承的语法糖。 void f(int *X) == void f(int X[]);

(与函数的函数参数相同。void g(void X(void)) == void g(void (*X)(void)))。