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

loc*_*e14 2 c arrays pointers

a[i]*(a + i)访问i阵列的第i个元素a.

有理由偏爱一个(性能,可读性等)吗?

Sha*_*our 17

从语言的角度来看,两者都不是更好,因为它们是相同的,数组索引应该只是指针算术的语法糖.我们可以从草案C99标准部分6.5.2.1 Array subscripting中看到这个(强调我的):

[...]下标operator []的定义是E1 [E2] (*((E1)+(E2)))相同.[..]

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


Joh*_*mew 6

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


Mic*_*ael 6

尽管它们在阵列中是相同的,但我更喜欢[i],原因如下.假设你有这样的代码:

double gradient[3];

// 200 lines later
double dx = gradient[0]; // Works fine
double dy = *(gradient + 1); // Works just as well
Run Code Online (Sandbox Code Playgroud)

然后有人认为std :: vector看起来比double []更好:

vector<double> gradient;

// 200 lines later
double dx = gradient[0]; // Still works
double dy = *(gradient + 1); // Ouch!
Run Code Online (Sandbox Code Playgroud)

然后其他人决定一直以对象为导向:

class Gradient
{
public:
    double operator[](int index) const; 
};

// 1000 lines later
Gradient gradient;

// 200 lines later
double dx = gradient[0]; // Still works
double dy = *(gradient + 1); // Ouch!!!
Run Code Online (Sandbox Code Playgroud)

因此,从可维护性的角度来看,我更倾向于准确地说出我的意思,而不是用依赖于上下文的同义词来模糊意图.如果我的意思是"采取一个"的第i个元素,那么我在C++语言中就是这么说的:

a[i];
Run Code Online (Sandbox Code Playgroud)

而不是依赖于一个的特定实现可以使用一个更高级的表达式.

  • OP只使用C标记了问题,而不是C++.因此,这个答案完全无关紧要. (3认同)