C / C ++中p [i],i [p]和*(p + i),*(i + p)之间的差异

时间:2014-01-27 05:19:56

标签: c++ c

我想知道 C / C ++中以下四个术语的区别:

  1. p [i]

  2. I [P]

  3. *(P + I)

  4. *(I + P)

  5. 其中p是Array,i是循环当前索引。

4 个答案:

答案 0 :(得分:7)

根据标准定义,

p[i]相当于*(p+i)。由于添加是可交换的,因此*(p+i)*(i+p)相同。根据之前声明的规则,*(i+p)相当于i[p]

所以,它们都是一样的。

请注意,这仅适用于内置运算符(即应用于内置类型的运算符)。用户定义的运算符([]+)不必遵循这些规则。

答案 1 :(得分:2)

  1. 这将访问p指向的数组的第(i + 1)个元素。这可以是静态数组或动态数组 - 在任何一种情况下,p都指向第一个元素(0)。
  2. 这是编写相同内容的一种不好的方法,不应该在实际代码中使用。这将导致将i视为指向数组的指针,将p视为索引。从数学角度来说,它可以解决相同的内存位置,但是如果编写的话,我会感到惊讶,如果它编译(但是,它如示例中所示 - 但它仍然是一种很糟糕的方式来构造代码,因为它反对正常惯例)。
  3. 这与#1
  4. 相同
  5. 也与#1
  6. 相同

    您可以全部查看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]

  1. arr --->数组的基地址和noffset
  2. arr[n] --->访问数组中的n元素或更好地n偏离基地
  3. *(arr + n) == *(n + arr)n偏移量添加到基地址以获取元素。
  4. n[arr] ==只是另一种访问数组的方式,“associative property”