[英]Difference Between *(Pointer + Index) and Pointer[]
int* myPointer = new int[100];
// ...
int firstValue = *(myPointer + 0);
int secondValue = myPointer[1];
*(myPointer + index)
和myPointer[index]
之间有什么功能区别吗? 哪个被认为是更好的做法?
在功能上,它们是相同的。
语义上的指针引用说,“这是一件事,但我真正关心的事情X
空间了”,而数组访问说:“这里有一堆东西,我关心的Xth
之一。”
在大多数情况下,我更喜欢数组形式。
之间没有区别
*(array+10); //and
array[10];
但猜猜怎么了? 因为+
是可交换的
*(10 + array); //is all the same
10[array]; //! it's true try it !
不,它们在功能上是等效的。
首先, index
被放大到类型大小,然后添加到myPointer
基数,然后从该内存位置提取值。
“更好的实践”是更具可读性的一种,通常但不一定总是myPointer[index]
变体。
那是因为您通常对数组的元素感兴趣,而不是要取消引用的内存位置。
我知道没有任何功能差异,但myPointer[1]
形式最终更具可读性,并且发生编码错误的可能性要小得多。
直流电
*(myPointer + 1)
形式不允许更改指向对象的指针类型,因此无法访问重载的 [] 运算符。
调试也更难
int *ints[10];
int myint = ints[10];
视觉上更容易拾取
int *ints;
int myint = *(ints + 10);
编译器还可以插入范围检查以在编译时捕获错误。
直流电
更具可读性和可维护性的代码是更好的代码。
至于功能部分……没有区别。 两次你都在“玩记忆”。
没有功能差异。 使用任何一种形式的决定通常取决于您使用它的上下文。 现在在这个例子中,数组形式更易于使用和阅读,因此是显而易见的选择。 但是,假设您正在处理一个字符数组,例如,使用句子中的单词。 给定一个指向数组的指针,您可能会发现使用第二种形式更容易,如下面的代码片段所示:
int parse_line(char* line)
{
char* p = line;
while(*p)
{
// consume
p++;
}
...
}
实际上,当一个数组 'a' 被初始化时,一个指向它的第一个内存位置的指针即.. a[0] 被返回,它只是 a ;
所以如果你做 'a+1' 它实际上是一个指向 a[1] 的指针
如果你做 'a+2' 它实际上是一个指向 a[2] 的指针
如果你做 'a+3' 它实际上是一个指向 a[3] 的指针等等,
所以如果你这样做 *(a+1) 你会得到 a[1] 的值,其他值也类似。 如果你这样做 *(a) 你实际上得到了一个 [0],所以我认为它现在很清楚它是如何工作的..
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.