Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 访问字符指针的不同方法在功能上有什么不同吗?_C_Char - Fatal编程技术网

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”