*(指针+索引)和指针[]之间的区别

Max*_*xpm 25 c++ pointers

int* myPointer = new int[100];

// ...

int firstValue = *(myPointer + 0);
int secondValue = myPointer[1];
Run Code Online (Sandbox Code Playgroud)

有没有之间的功能差异*(myPointer + index)myPointer[index]?这被认为是更好的做法?

Mik*_*ron 42

在功能上,它们是相同的.

在语义上,指针取消引用说"这是一个东西,但我真的关心X空间的东西",而数组访问说"这是一堆事情,我关心那个Xth."

在大多数情况下,我更喜欢阵列形式.

  • @Fritschy:嗯,作为程序员,我假设我们从0算起;) (5认同)
  • 让我们不要开始一场火焰战争,我们可以:) (4认同)
  • 有人投了这票吗?我希望人们会发表评论,并告诉我答案有什么问题. (3认同)
  • +1 的语义,很好的总结。每当我有一个指针时,我经常很想使用 `*(p + offset)`,以获得一些一致性的想法(与“实际”数组相比),但实际上我发现 `p[offset]` 看起来更好而且更多大多数情况下是直观的,将“+”形式降级为“与其他事物的偏移”。 (2认同)

hha*_*fez 24

两者之间没有区别

*(array+10); //and
array[10];
Run Code Online (Sandbox Code Playgroud)

但猜猜怎么了?因为+可交换的

 *(10 + array); //is all the same
 10[array]; //! it's true try it !
Run Code Online (Sandbox Code Playgroud)


pax*_*blo 12

不,它们在功能上是等价的.

首先,index按比例放大到类型大小然后添加到myPointer基础,然后从该内存位置提取值.

"更好的练习"是更易读的,通常但不一定总是myPointer[index]变体.

那是因为你通常对数组的元素感兴趣,而不是取消引用的内存位置.


Dev*_*ris 6

我知道没有任何功能差异,但表单myPointer[1]最终更具可读性,并且发生编码错误的可能性要小得多。

直流电

该表单*(myPointer + 1)不允许更改指向对象的指针类型,因此无法访问重载的 [] 运算符。

调试也更难

 int *ints[10];
 int myint = ints[10]; 
Run Code Online (Sandbox Code Playgroud)

比视觉更容易拾取

 int *ints;
 int myint = *(ints + 10); 
Run Code Online (Sandbox Code Playgroud)

编译器还可以插入范围检查以在编译时捕获错误。

直流电