"array"和"&array [0]"完全可以互换吗?

Pow*_*ck1 2 c arrays pointers parameter-passing function-call

是的,以前曾经多次询问过,但我想知道哪一个更合适?

typedef struct {
    int a;
    int addr[8];
} usr_command;

usr_command* p_usr_command;

int foo(int* parameter)
{}
Run Code Online (Sandbox Code Playgroud)

那么哪一个不太容易出问题?

foo(p_usr_command->addr);
Run Code Online (Sandbox Code Playgroud)

要么

foo(&p_usr_command->addr[0]);
Run Code Online (Sandbox Code Playgroud)

Sou*_*osh 8

这种情况下(传递数组名称传递数组中第一个对象的地址作为函数参数),两个片段都是等效的.

引用C11,章节§6.3.2.1,左值,数组和函数指示符(强调我的)

除非它是运算sizeof符,_Alignof运算符或一元运算&符的操作数,或者是用于初始化数组的字符串文字,否则将类型为''数组'的数组的表达式转换为类型为''的表达式指向类型''的指针指向数组对象的初始元素,而不是左值.[....]

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

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

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