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."
在大多数情况下,我更喜欢阵列形式.
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]变体.
那是因为你通常对数组的元素感兴趣,而不是取消引用的内存位置.
我知道没有任何功能差异,但表单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)
编译器还可以插入范围检查以在编译时捕获错误。
直流电