出于某种原因,我正在查看的代码有很多类似的东西
char tmp[4];
memcpy(&tmp[0],foo_pointer,bar_size)
我本来希望只是
char tmp[4];
memcpy(tmp,foo_pointer,bar_size)
我在第一种方式写它时有什么原因吗?
将数组传递给函数会导致数组衰减为指向其第一个元素的指针,因此两种调用方式都是等效的
不,他们是平等的。
即使没有定义,前者可能更清楚tmp
。
(为了让这个答案完整,为什么会这样,这是标准后期草案中有趣的一点:)
(6.3.2.1p3) 除非它是运算
sizeof
符、运算符_Alignof
或一元&
运算符的操作数,或者是用于初始化数组的字符串字面量,否则类型为“array of type ”的表达式将转换为表达式类型“pointer to type ”指向数组对象的初始元素,不是左值。如果数组对象具有寄存器存储类,则行为未定义。
这只是风格上的不同。有些人倾向于表达他们传递给函数的值是指针,因此他们&
在数组的第一个元素上使用 (addressof) 运算符。但是,这与传递数组本身相同,因为数组只能使用地址传递。
它们是等价的,但第一个会提醒未来的读者这tmp
是一个数组,而后者可能不会使这种区别很明显。
tmp
当且仅当人们已经知道这是一个数组时,后者更容易阅读。否则,它更有可能误导人们将其tmp
视为其他事物。把它归咎于在简单变量之后引入数组,或者任何你想归咎于它的东西;但是,没有额外修饰的变量通常被新手视为简单类型。
注意到写作可能很有用
&tmp[0]
是多余的。它相当于
&(*(tmp + 0))
所以意思是:取tmp,加0,得到tmp+0指向的值,得到tmp+0指向的值的地址。也就是说,你在做无用的操作。
只需写“tmp”。