“array”和“&array ”完全可以互换吗?
是的,以前曾经多次询问过,但我想知道哪一个更合适?
typedef struct { int a; int addr[8]; } usr_command; usr_command* p_usr_command; int foo(int* parameter) {}
那么哪一个不太容易出问题?
foo(p_usr_command->addr);
要么
foo(&p_usr_command->addr[0]);
?
在这种情况下( 传递数组名称与传递 数组 中第一个对象的地址作为函数参数),两个片段都是等效的。
引用C11
,章节§6.3.2.1, 左值,数组和函数指示符 ( 强调我的 )
除非它是
sizeof
运算符,_Alignof
运算符或一元&
运算符的操作数,或者是用于初始化数组的字符串文字,否则具有类型”数组类型”的表达式将转换为表达式输入”指向类型‘的指针 ,指向数组对象的初始元素,而不是左值。 [….]
但是,一般来说,它们并不相同 。
-
array
是int [8]
类型的数组int [8]
-
&(array[0])
是一个指针 ,类型为int *
正如EOF在他的评论中已经提出的那样,尝试将两个变量传递给sizeof
运算符并检查结果以获得动手输出。