【问题标题】:Are "array" and "&array[0]" completely interchangeable? [duplicate]“array”和“&array[0]”完全可以互换吗? [复制]
【发布时间】:2016-12-26 09:44:48
【问题描述】:

是的,之前已经问过很多次了,但我想知道哪个更可取?

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]);

?

【问题讨论】:

  • 尝试 sizeof(array)sizeof(&array[0])
  • @EOF 具有讽刺意味的是,这正是不同之处。然而,情况并非如此。
  • @SouravGhosh:不。完全是的区别是:sizeof _Alignof @987654328 @.
  • @EOF 我认为有点误解,我们都在同一页面上,您正在回答标题,而我指的是问题正文中的确切情况。 :)
  • 有问题的”是什么意思?

标签: c arrays pointers parameter-passing function-call


【解决方案1】:

this 情况下(传递数组名称 vs. 传递数组中第一个对象的地址 作为函数参数),两个 sn-ps 是等价的。

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

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

但是,总的来说,它们不一样

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

正如EOF in his comment 已经建议的那样,尝试将这两种变体都传递给sizeof 运算符并检查结果以获得实际输出。

【讨论】:

    猜你喜欢
    • 2020-05-06
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    • 2018-03-14
    • 2018-02-13
    • 2019-03-12
    相关资源
    最近更新 更多