c - C中的 "x"和 "&x[0]"有什么区别吗?

标签 c dereference

在浏览一些用 C 编写的软件时,我遇到了以下代码,我可以将其总结如下:

void fill_array_with_some_data(int *_)
{
    // assign some arbitrary int values to _[0] and _[1]
    _[0] = 42;
    _[1] = 24;
}

int main(int argc, char **argv)
{
    int x[2] = {0};
    fill_array_with_some_data(&x[0]);
    
    // do something with the data which is now is x
    if (x[0] & 0x42)
        // do something
    
    return 0;
}

看到 &x[0] 而不是简单的 x 对我来说似乎很奇怪。

两者有什么区别吗?

是否有任何理由希望使用 &x[0] 而不是简单地使用 x

最佳答案

除了风格之外没有任何区别。

&x[0] 作为参数传递可能表明程序员只希望函数访问第一个元素,而传递 x 则意味着他们希望函数访问第一个元素访问整个数组。但这仅仅是约定俗成的,问题中给出的代码示例显然甚至不遵守此约定。

就语言标准而言,表达式是完全等价的,至少在计算上下文中(sizeof 除外):&x[0] 是简写对于 &*(x + 0),可以简化为 &*x,然后是 x

关于c - C中的 "x"和 "&x[0]"有什么区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71893350/

相关文章:

c - 用于字符数组的 CRC32 的快速 C 实现

c - 为什么我们必须在打印地址在指针中的内存中的值之前将 void 指针转换为 int 或其他东西?

c - 如何使用procfs将内核数据发送到用户空间?

c - 有没有办法在线程创建/销毁时调用库线程局部初始化/清理?

C memcpy 反向

将 char 转换为 short

c++ - 在指向对象的指针 vector 中取消引用

c - C指针的 "**&ptr"和 "2**ptr"是什么意思?

c++ - 使用指向类的指针调用成员函数时获取 System.AccessViolationException

c - "The only operator that gives back a value is the de-referencing operator"