*(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[] 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

Using pointer to access array instead of index

div添加cursor:pointer;失效问题。

检查 C++ 中的指针定义性

android 触摸事件分析

Tailwind - 链接在悬停时没有默认光标指针

html 简单的预缓存