指针=&buffer [0]是否冗余?

时间:2019-01-26 17:01:21

标签: c arrays pointers

我最近正在阅读一些源代码,并在函数开头阅读以下内容:

char buffer[ 1000 ];
char *pointer;
pointer = &buffer[0];

我想我不明白。为什么不写:

pointer = buffer;

这里有一些秘密的含义吗?

4 个答案:

答案 0 :(得分:2)

根据情况,某些人可能会更容易理解。

有人可能会说,当您使用pointer = buffer;时,您打算将指针用作缓冲区,

如果您使用pointer = &buffer[0];,则打算将指针用作指针或缓冲区的项。

这两种情况恰好指向相同的地址。

答案 1 :(得分:2)

两个表达式都给出相同的结果值。因此,在您给定的情况下,这主要是首选样式的问题。

但是,如果在函数调用中使用表达式,则会有区别。静态代码分析工具应该抱怨

  

memcpy(&buffer [0],src,2 * sizeof(buffer [0]));

因为您声明要将两个元素写入一个数组元素。但是该工具不应抱怨

  

memcpy(&buffer,src,2 * sizeof(buffer [0]));

  

memcpy(buffer,src,2 * sizeof(buffer [0]));

因为您现在说要写入整个数组。

standard中的相关部分:

  

6.3.2.1左值,数组和函数指示符
   3 除非它是sizeof运算符的操作数或一元&运算符,或者是用于初始化数组的字符串文字,否则类型为“ array of type”的表达式将转换为类型为“类型的指针”的表达式指向数组对象的初始元素,而不是左值。 [...]

     

6.5.3.2地址和间接操作符

     

语义3 一元&运算符产生其操作数的地址。如果操作数的类型为“类型”,则结果的类型为“类型的指针”。 [...]类似地,如果操作数是[]运算符的结果,则不会对&运算符或[]所隐含的一元*求值,并且结果就像是&运算符已被删除且[ ]运算符更改为a +运算符。否则,结果是指向由其操作数指定的对象或函数的指针。

答案 2 :(得分:1)

它们是完全相同的。我也更喜欢简单的版本

pointer = array; // implicit conversion from array to address of its 1st element
pointer = &array[0]; // explicitly set pointer to the address of array's 1st element

在某些情况下,根据您将如何使用指针,显式版本可能会更自成体系。

答案 3 :(得分:0)

根据C Standards#6.5.2.1

  

下标运算符[]的定义是E1 [E2]等于(*(((E1)+(E2))))..

所以

&buffer[0]

可以写为

&(*(buffer + 0))

请注意,运算符&用于获取地址,而运算符*用于取消引用。这些运算符相继使用时会相互抵消。因此,它等同于

(buffer + 0)

这不过是

buffer

因此,&buffer[0]等同于buffer