“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运算符或一元&运算符的操作数,或者是用于初始化数组的字符串文字,否则具有类型”数组类型”的表达式将转换为表达式输入”指向类型‘的指针 ,指向数组对象的初始元素,而不是左值。 [….]

但是,一般来说,它们并不相同

  • arrayint [8]类型的数组 int [8]
  • &(array[0])是一个指针 ,类型为int *

正如EOF在他的评论中已经提出的那样,尝试将两个变量传递给sizeof运算符并检查结果以获得动手输出。