int* myPointer = new int[100];
// ...
int firstValue = *(myPointer + 0);
int secondValue = myPointer[1];
*(myPointer + index)
和myPointer[index]
之间是否存在功能差异?这被认为是更好的做法?
答案 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代码。