3

出于某种原因,我正在查看的代码有很多类似的东西

char tmp[4];

memcpy(&tmp[0],foo_pointer,bar_size)

我本来希望只是

char tmp[4];

memcpy(tmp,foo_pointer,bar_size)

我在第一种方式写它时有什么原因吗?

4

5 回答 5

6

将数组传递给函数会导致数组衰减为指向其第一个元素的指针,因此两种调用方式都是等效的

于 2012-08-28T19:15:09.600 回答
3

不,他们是平等的。

即使没有定义,前者可能更清楚tmp

(为了让这个答案完整,为什么会这样,这是标准后期草案中有趣的一点:)

(6.3.2.1p3) 除非它是运算sizeof符、运算符_Alignof或一元&运算符的操作数,或者是用于初始化数组的字符串字面量,否则类型为“array of type ”的表达式将转换为表达式类型“pointer to type ”指向数组对象的初始元素,不是左值。如果数组对象具有寄存器存储类,则行为未定义。

于 2012-08-28T19:14:28.443 回答
1

这只是风格上的不同。有些人倾向于表达他们传递给函数的值是指针,因此他们&在数组的第一个元素上使用 (addressof) 运算符。但是,这与传递数组本身相同,因为数组只能使用地址传递。

于 2012-08-28T19:15:03.830 回答
1

它们是等价的,但第一个会提醒未来的读者这tmp是一个数组,而后者可能不会使这种区别很明显。

tmp当且仅当人们已经知道这是一个数组时,后者更容易阅读。否则,它更有可能误导人们将其tmp视为其他事物。把它归咎于在简单变量之后引入数组,或者任何你想归咎于它的东西;但是,没有额外修饰的变量通常被新手视为简单类型。

于 2012-08-28T19:17:42.980 回答
1

注意到写作可能很有用

&tmp[0]

是多余的。它相当于

&(*(tmp + 0))

所以意思是:取tmp,加0,得到tmp+0指向的值,得到tmp+0指向的值的地址。也就是说,你在做无用的操作。

只需写“tmp”。

于 2012-08-28T19:36:17.443 回答