int* myPointer = new int[100];
// ...
int firstValue = *(myPointer + 0);
int secondValue = myPointer[1];
*(myPointer + index)
和myPointer[index]
之间是否有任何功能差异?哪个被认为是更好的做法?*(指针+索引)与指针[]的区别
int* myPointer = new int[100];
// ...
int firstValue = *(myPointer + 0);
int secondValue = myPointer[1];
*(myPointer + index)
和myPointer[index]
之间是否有任何功能差异?哪个被认为是更好的做法?*(指针+索引)与指针[]的区别
在功能上它们是相同的。
从语义上讲,指针解引用说:“这是一件事,但我真的关心的东西X
空间”,而数组访问说:“这里有一堆东西,我关心Xth
之一。
在大多数情况下,我更喜欢数组形式。
有人投下了这个?我希望人们评论,并告诉我我的答案有什么问题。 – 2011-01-08 04:58:52
不是我,但在这种情况下,它不是'Xth',而是'X + 1th'。 – 2011-01-12 22:17:59
@Fritschy:那么,作为程序员,我假设我们从0开始计数;) – 2011-01-14 07:40:49
不,它们在功能上是等效的。
首先,index
按比例放大到字体大小,然后添加到myPointer
基底,然后从该存储位置提取该值。
“更好的做法”是可读性更强的版本,通常但不一定总是myPointer[index]
版本。
这是因为您通常对数组元素感兴趣,而不是解引用的内存位置。
我知道没有功能差异,但是形式myPointer[1]
最终更具可读性并且不太可能引起编码错误。
DC
形式*(myPointer + 1)
不允许用于改变指针的类型的一个对象,并因此得到接近重载[]操作符。
另外调试是更难
int *ints[10];
int myint = ints[10];
更容易拾取视觉上比
int *ints;
int myint = *(ints + 10);
也编译器可以插入范围检查捕获错误在编译时。
DC
+1 - 关键点重载操作符[]'重载。 – 2011-01-07 07:40:06
但是当你需要地址时,'ints + 10'的形式比'&ints [10]'好。 – ruslik 2011-01-07 09:39:43
如果你需要的地址你不关心重载操作符[],并避免它更安全。 – 2013-12-11 16:23:01
更可读和更易维护的代码是更好的代码。
至于功能部分...没有区别。这两次你都“在玩记忆”。
没有功能差异。使用任何形式的决定通常取决于您使用它的上下文。现在在这个例子中,数组形式更易于使用和阅读,因此是明显的选择。但是,假设你正在处理一个字符数组,比如说,消耗了一个句子中的单词。给定一个指向数组的指针,你可能会发现它更容易使用第二种形式,如下面的代码片段:
int parse_line(char* line)
{
char* p = line;
while(*p)
{
// consume
p++;
}
...
}
有
*(array+10); //and
array[10];
但你猜怎么没有区别?因为+
是associative
*(10 + array); //is all the same
10[array]; //! it's true try it !
这是真的,因为'+'是可交换的。 '+'操作也是联想的,但这并不重要。 – rcode 2018-03-04 20:13:51
实际上,当一个数组“A”被初始化一个指向它的第一存储器位置即.. A [0]被返回其只不过是一个;
所以,如果你 'A + 1',它实际上是一个指向[1]
,如果你做 'A + 2',它实际上是一个指向[2]
如果你做'+ 3'它实际上是一个指针[3] 等,
所以如果你做*(a + 1),你会得到一个[1]的价值和类似的其他值也。 (0), 因此,我认为它现在很清楚它是如何工作的。
忘记了:'int thirdValue = 2 [myPointer];'哪个疯狂也有效。 – 2011-01-07 08:41:00
@Martin真的吗?呵呵。我想每天都要学点新东西。 – Maxpm 2011-01-07 14:36:44
@Maxpm - [数组下标在C中是可交换的](http://c-faq.com/aryptr/joke.html) – jww 2013-06-03 00:42:31