*(指针+索引)和指针[]之间的区别

时间:2011-01-07 04:16:27

标签: c++ pointers

int* myPointer = new int[100];

// ...

int firstValue = *(myPointer + 0);
int secondValue = myPointer[1];

*(myPointer + index)myPointer[index]之间是否存在功能差异?这被认为是更好的做法?

8 个答案:

答案 0 :(得分:40)

从功能上讲,它们完全相同。

在语义上,指针取消引用说“这是一件事,但我真的关心X空间”,而数组访问说“这是一堆事情,我关心{{1}一个。“

在大多数情况下,我更喜欢数组形式。

答案 1 :(得分:21)

之间没有区别
*(array+10); //and
array[10];

但猜猜是什么?因为+commutative

 *(10 + array); //is all the same
 10[array]; //! it's true try it !

答案 2 :(得分:12)

不,它们功能相同。

首先,将index扩展到类型大小,然后添加到myPointer基础,然后从该内存位置提取值。

“更好的做法”是更易读的,通常但不一定总是myPointer[index]变体。

那是因为你通常对数组的元素感兴趣,而不是要取消引用的内存位置。

答案 3 :(得分:3)

我知道没有功能差异,但myPointer[1]形式最终更具可读性,并且不太可能产生编码错误。

DC

表单*(myPointer + 1)不允许更改指向对象的指针类型,因此可以访问重载的[]运算符。

另外调试要困难得多

 int *ints[10];
 int myint = ints[10]; 

更容易在视觉上拾取
 int *ints;
 int myint = *(ints + 10); 

编译器也可以插入范围检查以在编译时捕获错误。

DC

答案 4 :(得分:1)

更易读,更易维护的代码是更好的代码。

功能部分......没有区别。两次你都在“玩弄记忆”。

答案 5 :(得分:1)

没有功能差异。使用任何一种形式的决定通常取决于您使用它的上下文。现在在这个例子中,数组形式更易于使用和阅读,因此是显而易见的选择。但是,假设您正在处理一个字符数组,比如说,在句子中使用单词。给定指向数组的指针,您可能会发现使用第二个表单更容易,如下面的代码片段所示:

int parse_line(char* line) 
{
    char* p = line;
    while(*p)
    {
         // consume
         p++;
    }
    ...
}

答案 6 :(得分:0)

实际上,当一个阵列' a'初始化一个指向其第一个内存位置的指针,即...返回一个[0],它只是一个;

所以,如果你做了+ 1'它实际上是指向[1]

的指针

如果你这样做' a + 2'它实际上是指向[2]

的指针

如果你做了' a + 3'它实际上是指向[3]的指针  等等,

所以,如果你做*(a + 1),你将获得a [1]的值,并且其他值也相似。 如果你这样做*(a)你实际得到[0], 所以我认为它现在非常清楚如何运作..

答案 7 :(得分:0)

编辑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标志编译,将生成扩展名为.s的汇编代码文件 我将.s文件与kdiff3进行了比较,比较显示它们产生了相同的asm代码。

Here is the proof