*(Pointer + Index) 和 Pointer[] 之间的区别
Posted
技术标签:
【中文标题】*(Pointer + Index) 和 Pointer[] 之间的区别【英文标题】:Difference Between *(Pointer + Index) and Pointer[] 【发布时间】:2022-01-04 13:28:48 【问题描述】:int* myPointer = new int[100];
// ...
int firstValue = *(myPointer + 0);
int secondValue = myPointer[1];
*(myPointer + index)
和myPointer[index]
在功能上有区别吗?哪个被认为是更好的做法?
【问题讨论】:
你忘记了:int thirdValue = 2[myPointer];
这也很疯狂。
@Martin 真的吗?嗯。我想,每天都能学到新东西。
@Maxpm - Array subscripting is commutative in C
没有区别。 array[index]
和 index[array]
只是 *(array + index)
的语法糖。
【参考方案1】:
在功能上,它们是相同的。
从语义上讲,指针取消引用表示“这里有一个东西,但我真的很关心 X
空格上方的东西”,而数组访问表示“这里有很多东西,我关心 Xth
一个。”
在大多数情况下,我更喜欢数组形式。
【讨论】:
有人投了反对票?我希望人们发表评论,并告诉我我的答案有什么问题。 不是我,但在这种情况下不是Xth
,而是X+1th
。
@Fritschy:好吧,作为程序员,我假设我们从 0 开始计数;)
我们不要开始一场火焰战争,好吗:)
语义+1,很好的总结。每当我有一个指针时,我经常很想使用*(p + offset)
,以获得一些一致性的想法(与“实际”数组相比),但实际上我发现p[offset]
在大多数情况下看起来更好更直观,降级@ 987654327@ 形式为“从其他事物偏移”。【参考方案2】:
没有区别
*(array+10); //and
array[10];
但你猜怎么着?因为+
是commutative
*(10 + array); //is all the same
10[array]; //! it's true try it !
【讨论】:
这是真的,因为+
是可交换的。操作+
也是关联的,但这在这里并不重要。【参考方案3】:
不,它们在功能上是等效的。
首先,index
放大到类型大小,然后添加到 myPointer
基数,然后从该内存位置提取值。
“更好的做法”是更具可读性的做法,通常但不一定总是myPointer[index]
变体。
那是因为您通常对数组的元素感兴趣,而不是要取消引用的内存位置。
【讨论】:
【参考方案4】:据我所知,没有功能上的区别,但 myPointer[1]
的形式最终更具可读性,而且发生编码错误的可能性也小得多。
直流
*(myPointer + 1)
形式不允许更改指向对象的指针类型,因此无法访问重载的 [] 运算符。
调试也困难得多
int *ints[10];
int myint = ints[10];
比视觉上更容易拾取
int *ints;
int myint = *(ints + 10);
编译器也可以插入范围检查以在编译时捕获错误。
直流
【讨论】:
但是当你需要地址的时候,ints + 10
的形式比&ints[10]
好。
如果你需要地址你不关心重载的operator[],避免它更安全。【参考方案5】:
更具可读性和可维护性的代码是更好的代码。
至于功能部分...没有区别。这两次你都是在“玩记忆”。
【讨论】:
【参考方案6】:没有功能上的区别。使用任何一种形式的决定通常取决于您使用它的上下文。现在在这个例子中,数组形式更易于使用和阅读,因此是显而易见的选择。但是,假设您正在处理一个字符数组,例如,使用一个句子中的单词。给定一个指向数组的指针,您可能会发现使用第二种形式更容易,如下面的代码 sn-p 所示:
int parse_line(char* line)
char* p = line;
while(*p)
// consume
p++;
...
【讨论】:
【参考方案7】:编辑 1:十年前的问题。但是,我认为这个答案将有助于了解编译器的观点。
编译器为这两种情况创建相同的机器代码。这是一个证据,
代码 1
#include<stdio.h>
int main()
int myArr[5] = 1, 2, 3, 4, 5;
int value = myArr[0];
代码 2
#include<stdio.h>
int main()
int myArr[5] = 1, 2, 3, 4, 5;
int value = *(myArr + 0);
下面是用 gcc -S 编译这两个代码的 C 代码生成的汇编代码的比较结果。
【讨论】:
【参考方案8】:实际上,当一个数组 'a' 被初始化时,一个指向它的第一个内存位置的指针,即.. a[0] 被返回,它只不过是 a ;
所以如果你执行 'a+1' 它实际上是一个指向 a[1] 的指针
如果你执行 'a+2' 它实际上是一个指向 a[2] 的指针
如果你执行 'a+3' 它实际上是一个指向 a[3] 的指针 以此类推,
因此,如果您执行 *(a+1),您将获得 a[1] 的值,其他值也类似。 如果你做 *(a) 你实际上得到 a[0], 所以我认为它现在很清楚它是如何工作的..
【讨论】:
以上是关于*(Pointer + Index) 和 Pointer[] 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章