正如Joel在Stack Overflow播客#34中指出的,在C编程语言(又名:K&R)中,提到了C:a[5]==5[a]中数组的这个属性
乔尔说这是因为指针运算,但我仍然不明白。为什么a[5]==5[a]?
正如Joel在Stack Overflow播客#34中指出的,在C编程语言(又名:K&R)中,提到了C:a[5]==5[a]中数组的这个属性
乔尔说这是因为指针运算,但我仍然不明白。为什么a[5]==5[a]?
当前回答
因为C编译器总是将数组表示法转换为指针表示法。a[5]=*(a+5)也是5[a]=*所以,两者都是相等的。
其他回答
不是答案,只是一些思考的食物。如果类具有重载的索引/下标运算符,则表达式0[x]将不起作用:
class Sub
{
public:
int operator [](size_t nIndex)
{
return 0;
}
};
int main()
{
Sub s;
s[0];
0[s]; // ERROR
}
由于我们无法访问int类,因此无法执行此操作:
class int
{
int operator[](const Sub&);
};
对于C中的指针,我们有
a[5] == *(a + 5)
而且
5[a] == *(5 + a)
因此,a[5]==5[a]是正确的。
C标准对[]运算符的定义如下:
a[b]==*(a+b)
因此,[5]将评估:
*(a + 5)
并且5[a]将评估:
*(5 + a)
a是指向数组的第一个元素的指针。a[5]是距离a更远的5个元素的值,与*(a+5)相同,从小学数学中我们知道它们是相等的(加法是可交换的)。
因为数组访问是根据指针定义的。a[i]被定义为表示*(a+i),它是可交换的。
很好的问题/答案。
我只想指出,C指针和数组并不相同,尽管在这种情况下,差异并不是本质的。
考虑以下声明:
int a[10];
int* p = a;
在a.out中,符号a位于数组开始的地址,符号p位于存储指针的地址,指针在该内存位置的值是数组的开始。