我最近正在阅读一些源代码,并在函数开头阅读以下内容:
char buffer[ 1000 ];
char *pointer;
pointer = &buffer[0];
我想我不明白。为什么不写:
pointer = buffer;
这里有一些秘密的含义吗?
答案 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
。