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

时间:2016-12-26 09:44:48

标签: 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);

foo(&p_usr_command->addr[0]);

1 个答案:

答案 0 :(得分:8)

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

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

  

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

但是,一般来说,它们 不一样

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

正如EOF in his comment已经建议的那样,尝试将两个变体传递给.nav_bar { background: #c30015; margin-left: 50px; float: left; } .nav_bar ul { padding: 0; margin: 0; display: flex; border-bottom: thin white solid; } .nav_bar ul li { list-style: none; } .nav_bar ul li a { text-decoration: none; color: #ffffff; display: block; border-right: 1px solid #fff; padding: 8px 16px; } .nav_bar ul li a:hover { background: #e6b3a1; text-decoration: none; color: #c3000f; } .down_nav_bar { background: #e6b3a1; margin-left: 34px; float: left; } .down_nav_bar ul { padding: 0; margin: 0; display: flex; } .down_nav_bar ul li { list-style: none; } .down_nav_bar ul li a { text-decoration: none; color: #c3000f; display: block; padding: 8px 23px 8px 18px; } .down_nav_bar ul li a:link { text-decoration: none; } .down_nav_bar ul li a:visited { border-bottom: 2px #c3000f solid; text-decoration: none; } .down_nav_bar ul li a:hover { border-bottom: 2px #c3000f solid; text-decoration: none; } .down_nav_bar ul li a:active { border-bottom: 2px #c3000f solid; text-decoration: none; }运算符并检查结果以获得动手输出。