我想知道 C / C ++中以下四个术语的区别:
p [i]
I [P]
*(P + I)
*(I + P)
其中p是Array,i是循环当前索引。
答案 0 :(得分:7)
p[i]
相当于*(p+i)
。由于添加是可交换的,因此*(p+i)
与*(i+p)
相同。根据之前声明的规则,*(i+p)
相当于i[p]
。
所以,它们都是一样的。
请注意,这仅适用于内置运算符(即应用于内置类型的运算符)。用户定义的运算符([]
和+
)不必遵循这些规则。
答案 1 :(得分:2)
p
指向的数组的第(i + 1)个元素。这可以是静态数组或动态数组 - 在任何一种情况下,p
都指向第一个元素(0)。i
视为指向数组的指针,将p
视为索引。从数学角度来说,它可以解决相同的内存位置,但是如果编写的话,我会感到惊讶,如果它编译(但是,它如示例中所示 - 但它仍然是一种很糟糕的方式来构造代码,因为它反对正常惯例)。您可以全部查看here
答案 2 :(得分:0)
p [i]表示您访问数组 p 的 i + 1 元素。
*(p + i)表示您正在定义指针* p,并且访问内存位置的内容远离p乘以p指向的数据大小的i倍。
(在数组p [i]的情况下,这意味着相同,只是在使用指针显式时添加其他含义)。
假设p是指向int 的指针,并且int的大小是4个字节,则p + i指向内存位置 x + 4 * i。其中 x 是 p 指向的内存位置。因此,*(p + i)用于访问该内存位置的内容。
编辑:,我[p]和*(i + p)与p [i]相同(正如我刚才所知):)
答案 3 :(得分:0)
您声明了一个数组arr[n]
,
arr
--->
数组的基地址和n
是offset
。arr[n]
--->
访问数组中的n
元素或更好地n
偏离基地*(arr + n)
== *(n + arr)
将n
偏移量添加到基地址以获取元素。 n[arr]
==只是另一种访问数组的方式,“associative property”