C 是";数组";及&;数组[0]”;完全可互换?

C 是";数组";及&;数组[0]”;完全可互换?,c,arrays,pointers,parameter-passing,function-call,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) {} 那么,哪一个更不容易出现问题呢 foo(p_usr_command->addr); 或 ?在这种情况下(传递数组名与传递数组中第一个对象的地址作为函数参数),两个代码段是等效的 引用C11,第§6.3.2.

是的,以前有人问过很多次,但我想知道哪一个更可取

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

usr_command* p_usr_command;

int foo(int* parameter)
{}
那么,哪一个更不容易出现问题呢

foo(p_usr_command->addr);

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

引用
C11
,第§6.3.2.1章,左值、数组和函数指示符(重点)

除非它是
sizeof
运算符、
\u Alignof
运算符或 一元
&
运算符,或者是用于初始化数组的字符串文字,一个具有 类型“”的数组“”已转换为类型为“”指向类型“”的指针的表达式 指向数组对象的初始元素,并且不是左值。[……]

但是,一般来说,它们是不同的

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

正如前面所建议的,尝试将这两个变量传递给
sizeof
操作符,并检查结果以获得实际输出。

尝试
sizeof(array)
sizeof(&array[0])
@EOF恰恰是不同之处。然而,情况不同。@SouravGhosh:不。确切的区别是:
sizeof
\u Alignof
&
@EOF我认为有点误解,我们都在同一页上,你回答的是标题,而我指的是问题正文中的确切情况。:)“有问题”在什么意义上?
foo(&p_usr_command->addr[0]);