繁体   English   中英

*(Pointer + Index) 和 Pointer[] 的区别

[英]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++;
    }
    ...
}

编辑 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 代码生成的汇编代码所做的比较结果。

这是证据

实际上,当一个数组 '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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM