2011-01-07 119 views
15
int* myPointer = new int[100]; 

// ... 

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

*(myPointer + index)myPointer[index]之间是否有任何功能差异?哪个被认为是更好的做法?*(指针+索引)与指针[]的区别

+8

忘记了:'int thirdValue = 2 [myPointer];'哪个疯狂也有效。 – 2011-01-07 08:41:00

+0

@Martin真的吗?呵呵。我想每天都要学点新东西。 – Maxpm 2011-01-07 14:36:44

+3

@Maxpm - [数组下标在C中是可交换的](http://c-faq.com/aryptr/joke.html) – jww 2013-06-03 00:42:31

回答

30

在功能上它们是相同的。

从语义上讲,指针解引用说:“这是一件事,但我真的关心的东西X空间”,而数组访问说:“这里有一堆东西,我关心Xth之一。

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

+2

有人投下了这个?我希望人们评论,并告诉我我的答案有什么问题。 – 2011-01-08 04:58:52

+0

不是我,但在这种情况下,它不是'Xth',而是'X + 1th'。 – 2011-01-12 22:17:59

+5

@Fritschy:那么,作为程序员,我假设我们从0开始计数;) – 2011-01-14 07:40:49

11

不,它们在功能上是等效的。

首先,index按比例放大到字体大小,然后添加到myPointer基底,然后从该存储位置提取该值。

“更好的做法”是可读性更强的版本,通常但不一定总是myPointer[index]版本。

这是因为您通常对数组元素感兴趣,而不是解引用的内存位置。

3

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

DC

形式*(myPointer + 1)不允许用于改变指针的类型的一个对象,并因此得到接近重载[]操作符。

另外调试是更难

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

更容易拾取视觉上比

int *ints; 
int myint = *(ints + 10); 

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

DC

+0

+1 - 关键点重载操作符[]'重载。 – 2011-01-07 07:40:06

+0

但是当你需要地址时,'ints + 10'的形式比'&ints [10]'好。 – ruslik 2011-01-07 09:39:43

+0

如果你需要的地址你不关心重载操作符[],并避免它更安全。 – 2013-12-11 16:23:01

0

更可读和更易维护的代码是更好的代码。

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

1

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

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

*(array+10); //and 
array[10]; 

但你猜怎么没有区别?因为+associative

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

这是真的,因为'+'是可交换的。 '+'操作也是联想的,但这并不重要。 – rcode 2018-03-04 20:13:51

0

实际上,当一个数组“A”被初始化一个指向它的第一存储器位置即.. A [0]被返回其只不过是一个;

所以,如果你 'A + 1',它实际上是一个指向[1]

,如果你做 'A + 2',它实际上是一个指向[2]

如果你做'+ 3'它实际上是一个指针[3] 等,

所以如果你做*(a + 1),你会得到一个[1]的价值和类似的其他值也。 (0), 因此,我认为它现在很清楚它是如何工作的。