表达式(如anArray+)+;在C中使用

表达式(如anArray+)+;在C中使用,c,arrays,pointers,C,Arrays,Pointers,我目前正在使用《C初级读物加第六版》一书学习C 在关于数组和指针的一章中,作者指出 就C而言,两个表达式ar[i]和*(ar+i)是等价的 如果ar是数组的名称,则两者都起作用;如果ar是数组的名称,则两者都起作用 ar是指针变量。但是,使用诸如ar之类的表达式++ 仅当ar是指针变量时有效 我用c语言思考,ar[0]和*(ar+0)是等价的,它们都等于数组的索引0中包含的值。但是为什么像ar++这样的表达式只有在ar是指针变量时才起作用呢?我真的被它背后的逻辑卡住了。假设arr是数组,并且ar

我目前正在使用《C初级读物加第六版》一书学习C

在关于数组和指针的一章中,作者指出

就C而言,两个表达式ar[i]和*(ar+i)是等价的 如果ar是数组的名称,则两者都起作用;如果ar是数组的名称,则两者都起作用 ar是指针变量。但是,使用诸如ar之类的表达式++ 仅当ar是指针变量时有效


我用c语言思考,
ar[0]
*(ar+0)
是等价的,它们都等于数组的索引0中包含的值。但是为什么像
ar++
这样的表达式只有在
ar
是指针变量时才起作用呢?我真的被它背后的逻辑卡住了。

假设
arr
是数组,并且
arr++
对它起作用。那么,应该怎么办呢?如果它是递增的话现在,指向数组第一个元素的指针在哪里?因此,指向数组第一个元素的数组的值可能会递增,并且不再符合逻辑,这是没有意义的

另一方面,如果
arr
是指针,则可以将其移动并设置到其他位置。因此,可以更改指针的值


总之,虽然数组名称指向已分配数组的第一个元素这一事实是正确的,但像指针一样随时间设置或更改是没有意义的。

ar++增加指向数组的指针的位置。通常情况下,ar++会将指针移动到数组中的下一个元素。
声明数组后,指针最初指向第一个元素或ar[0]。ar++使指针移动到下一个元素或ar[1]以此类推。

ar++
相当于
ar=ar+1。
因此,基本上这是一个赋值,因此通过增量,我们正在更改数组的基址,这是不允许的。

ar++

评估为

ar=ar+1
这对数组
ar[]
不起作用,因为数组一旦声明就不允许您永久更改其起始索引,这确实是
*arr
arr[]
之间的主要区别


事实上,对于数组
ar[]
ar[1]
*(ar+1)
之所以有效,是因为指针类型算术或指针表示法可用于数组,反之亦然,两者应产生相同的代码。

您可以修改指针指向的内容。对于表示数组的标识符,情况并非如此。
ar++
需要左值,数组不是左值,而是指针。直接相关的是同样的原因
ar=
不适用于数组,但适用于指针。在C中不允许更改数组的“基址”。因此它不起作用。请参阅我的答案。和数组和指针之间有区别。这听起来可能很明显,但这是一个常见的错误。尝试对两者都执行sizeof。当你说array时,它有meta关于它的完整大小,知道起始地址和结束地址,其名称指向基(起始)。但指针只是指向某个地方。数组名称是常量,不能修改。因此增加它们是错误的。请注意,您可以这样做arr+1。