C 访问字符指针的不同方法在功能上有什么不同吗?
出于某种原因,我正在查看的代码有很多类似的内容C 访问字符指针的不同方法在功能上有什么不同吗?,c,char,C,Char,出于某种原因,我正在查看的代码有很多类似的内容 char-tmp[4] memcpy(&tmp[0],foo\u指针,bar\u大小) 我会简单地期待 char-tmp[4] memcpy(tmp、foo_指针、bar_大小) 有什么原因让我在第一次写的时候遗漏了吗?没有,它们是相等的 前者可能更清晰,即使没有tmp的定义 (为了完整地回答为什么会这样,下面是标准最新草案中有趣的一点:) (6.3.2.1p3)除非它是sizeof运算符的操作数,\u运算符或 一元&运算符,或是用于初始化
char-tmp[4]
memcpy(&tmp[0],foo\u指针,bar\u大小)
我会简单地期待
char-tmp[4]
memcpy(tmp、foo_指针、bar_大小)
有什么原因让我在第一次写的时候遗漏了吗?没有,它们是相等的
前者可能更清晰,即使没有tmp
的定义
(为了完整地回答为什么会这样,下面是标准最新草案中有趣的一点:)
(6.3.2.1p3)除非它是sizeof
运算符的操作数,\u
运算符或
一元&
运算符,或是用于初始化数组的字符串文字,一个具有
类型“array of type”转换为类型为“pointer to type”的表达式,该表达式指向
指向数组对象的初始元素,并且不是左值。如果数组对象具有
注册存储类,行为未定义
那只是风格上的不同。有些人倾向于表示他们传递给函数的值是指针,因此他们在数组的第一个元素上使用
&
(addressof)运算符。但是,这与传递数组本身相同,因为只能使用地址传递数组。将数组传递给函数会导致数组衰减为指向其第一个元素的指针,因此调用此数组的两种方法都是等效的,但是第一个将提醒未来的读者,tmp
是一个数组,而后者可能不会使这种区别变得明显
如果且仅当人们已经知道
tmp
是一个数组时,后者更容易阅读。否则,它更有可能误导人们将tmp
视为其他东西。把它归咎于在简单变量之后引入数组,或者任何你喜欢归咎于它的东西;但是,新手通常认为没有额外修饰的变量是一种简单的类型。注意到
&tmp[0]
这是多余的。相当于
&(*(tmp + 0))
这意味着:取tmp,加0,得到tmp+0所指的值,得到tmp+0所指值的地址。换句话说,你在做无用的操作
只要写“tmp”