C 使用[i]和*(a+;i)之间有区别吗?

C 使用[i]和*(a+;i)之间有区别吗?,c,arrays,pointers,C,Arrays,Pointers,a[i]和*(a+i)访问数组a的ith元素 是否有理由选择其中一种(性能、可读性等)?两者都是等效的。两者都不是首选的,但程序员通常使用a[i]a[i]=*(a+i)=i[a]从语言的角度来看,两者都不是更好的,因为它们是相同的,数组索引应该只是指针算法的语法糖。我们可以从6.5.2.1Array subscripting一节中看到这一点,该节说(我的重点): […]下标运算符[]的定义是E1[E2]与(*(E1)+(E2))[…]相同 虽然对于阅读你的代码的其他人来说,a[i]可能更具可读性

a[i]
*(a+i)
访问数组
a
i
th元素


是否有理由选择其中一种(性能、可读性等)?

两者都是等效的。两者都不是首选的,但程序员通常使用
a[i]
a[i]=*(a+i)=i[a]

从语言的角度来看,两者都不是更好的,因为它们是相同的,数组索引应该只是指针算法的语法糖。我们可以从
6.5.2.1
Array subscripting一节中看到这一点,该节说(我的重点):

[…]下标运算符[]的定义是E1[E2]与(*(E1)+(E2))[…]相同

虽然对于阅读你的代码的其他人来说,
a[i]
可能更具可读性。

就我而言(刚刚完成了一门C课程),没有什么区别

数组被实现为指向堆栈上第一个元素的指针。所以a+1只是堆栈上a:)后面的地址

编辑:
此外,正如John Bartholomew所提到的,即使它们是相同的,您也可能希望使用[i]来代替-这是“正常”的方式(也在其他语言中):

a[i]
应该是首选,因为它更常用,所以阅读代码的人会更快地理解它。

C没有运算符重载。所以你可以安全地使用任何你想要的东西

在阅读代码时,为了清晰起见,我会使用
a[I]

虽然它们在数组中是相同的,但出于以下原因,我更喜欢a[I]。假设您有如下代码:

double gradient[3];

// 200 lines later
double dx = gradient[0]; // Works fine
double dy = *(gradient + 1); // Works just as well
然后有人认为std::vector看起来比double[]更好:

vector<double> gradient;

// 200 lines later
double dx = gradient[0]; // Still works
double dy = *(gradient + 1); // Ouch!
因此,从可维护性的角度来看,我更愿意准确地说出我的意思,而不使用上下文相关的同义词来模糊意图。如果我的意思是“取A的第i个元素”,那么我在C++ + LINGO中准确地说:< /P>
a[i];

与其依赖于来实现一个的特定实现,还不如使用一个更华丽的表达式来实现同样的功能。

为了可读性的目的,我肯定会选择
a[I]

你甚至可以选择
i[a]
放在这两者之上。以最符合你程序其余部分风格的为准。@ShafikYaghmour你的答案或任何其他答案都不会说除
a[i]=*(a+i)=*(i+a)==i[a]
之外的任何东西,这实际上是一个常见问题。此外,您是否有证据支持哪个变量比另一个更好。@devnull两者都不应该比另一个更好,数组索引应该只是指针算法的语法糖衣,正如标准所说,应该是相同的。如果您有其他证据,则应提供解释性能差异的答案。我当然想看看,但那将是一个相当真实的答案,不是吗?说这个问题是基于观点的是愚蠢的。对这个问题有一个有效和完全真实的答案。一个代码< >代码>应该是相同的性能,除非您进入标准并看到它们应该是相同的。OP只用C而不是C++标记问题。因此,这个答案是完全不相关的。
a[i];