为什么sizeof(array_name)是数组的大小,为什么sizeof(&a [0])是指针的大小,即使将数组名传递给函数时,传递的是数组开头的位置数组。
答案 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))
)。