我知道 c 编译器认为以下函数定义相同
void test(int* array); // all converted to first one
void test(int array[]);
void test(int array[3]);
在 C99 标准中
除非它是 sizeof 运算符或一元 & 的操作数 运算符,或者是用于初始化数组的字符串文字,一个 类型为“类型数组”的表达式被转换为 类型为“指向类型的指针”的表达式指向初始值 数组对象的元素并且不是左值。如果数组对象 有寄存器存储类,行为未定义。
我的问题是在
int array[]
衰减为一个指针之后,那么它也是一个左值作为函数调用中的局部变量,是否违反了转换后的指针不应该是左值的标准?
没问题,因为这里有两件事在起作用:将数组参数调整为指针,以及如何设置函数参数。
您给出的三个声明的等效性在C标准的第6.7.6.3p7节中有详细说明:
将参数声明为“类型数组”应调整为 ‘‘qualified pointer to type’’,其中类型限定符(如果有的话)是 那些在数组类型推导的
和[
中指定的。如果 关键字static也出现在数组类型的]
和[
中 推导,然后对于函数的每次调用, 相应的实际参数应提供对第一个的访问 一个数组的元素,其元素的数量至少与 尺寸表达]
所以这意味着在上述所有情况下,参数
array
的类型都是int *
。
然后是如何填充参数。这是在 6.5.2.2p4 中关于函数调用的规定:
参数可以是任何完整对象类型的表达式。在 准备调用函数,评估参数,并且 每个参数都分配了相应参数的值
所以给出以下内容:
int a[5];
test(a);
在内部,有一个赋值,即
array = a
从传递的参数值到函数的实际参数。