正如Joel在Stack Overflow播客#34中指出的,在C编程语言(又名:K&R)中,提到了C:a[5]==5[a]中数组的这个属性

乔尔说这是因为指针运算,但我仍然不明白。为什么a[5]==5[a]?


当前回答

它在C语言中的指针和阵列教程中有很好的解释由Ted Jensen撰写。

Ted Jensen解释为:

事实上,这是真的,也就是说,无论你在哪里写一个替换为*(a+i)而没有任何问题。事实上,编译器将在任何情况下创建相同的代码。因此,我们看到了指针算术与数组索引相同。任一语法都会产生同样的结果。这并不是说指针和数组是一样的东西,它们不是。我们这么说只是为了确定对于数组的给定元素,我们可以选择两种语法,一种使用数组索引,另一种使用指针算法产生相同的结果。现在,看看最后一个表达式的一部分..(a+i)是使用+运算符和C的规则声明这样的表达式是交换的。即(a+i)与(i+a)相同。因此,我们可以写*(i+a)和*(a+i)一样容易。但*(i+a)可能来自i[a]!所有这些都带来了好奇如果:字符a[20];写a[3]=“x”;与写作相同3[a]=“x”;

其他回答

In C

 int a[]={10,20,30,40,50};
 int *p=a;
 printf("%d\n",*p++);//output will be 10
 printf("%d\n",*a++);//will give an error

指针p是“变量”,数组名称a是“助记符”或“同义词”,因此p++有效,而a++无效。

a[2]等于2[a],因为这两者的内部运算都是“指针算术”,内部计算为*(a+2)等于*(2+a)

因为数组访问是根据指针定义的。a[i]被定义为表示*(a+i),它是可交换的。

很好的问题/答案。

我只想指出,C指针和数组并不相同,尽管在这种情况下,差异并不是本质的。

考虑以下声明:

int a[10];
int* p = a;

在a.out中,符号a位于数组开始的地址,符号p位于存储指针的地址,指针在该内存位置的值是数组的开始。

因为C编译器总是将数组表示法转换为指针表示法。a[5]=*(a+5)也是5[a]=*所以,两者都是相等的。

它在C语言中的指针和阵列教程中有很好的解释由Ted Jensen撰写。

Ted Jensen解释为:

事实上,这是真的,也就是说,无论你在哪里写一个替换为*(a+i)而没有任何问题。事实上,编译器将在任何情况下创建相同的代码。因此,我们看到了指针算术与数组索引相同。任一语法都会产生同样的结果。这并不是说指针和数组是一样的东西,它们不是。我们这么说只是为了确定对于数组的给定元素,我们可以选择两种语法,一种使用数组索引,另一种使用指针算法产生相同的结果。现在,看看最后一个表达式的一部分..(a+i)是使用+运算符和C的规则声明这样的表达式是交换的。即(a+i)与(i+a)相同。因此,我们可以写*(i+a)和*(a+i)一样容易。但*(i+a)可能来自i[a]!所有这些都带来了好奇如果:字符a[20];写a[3]=“x”;与写作相同3[a]=“x”;