我在任何其他编程语言中都没有遇到过类似的符号,也就是说,我习惯于看到括号内的下标(而不是相反(。我理解给定一个数组foo
,foo
本质上是一个指向数组基地址的指针;以及指针表示法与数组表示法之间的相关性,也就是说,我得到了为什么foo[i], *(foo + i), *(i + foo)
都等价的基本原理。。。但我不明白i[foo]
与上述三者等效的原理,也不明白它是如何工作的。也许用英语重新表述这个符号会有所帮助,但我不知道该怎么做。
根据C标准(6.5.2.1数组下标(
2一个后缀表达式,后面跟一个方括号中的表达式[]是数组对象的元素的下标指定。这个下标运算符[]的定义是E1[E2]与(*((E1(+(E2(((。由于适用于binary+运算符,如果E1是数组对象(相当于指针到数组对象的初始元素(,并且E2是整数,E1[E2]表示E1的第E2个元素(从零开始计数(。
因此,由于操作+的交换性质,您可以编写
a[i]
作为
*( a + i )
或类似
i[a]
让我们考虑以下多维数组的声明
char * a[][2] =
{
{ { "Hello" }, { "World" } },
{ { "Hi" }, { "everybody" } }
};
为了访问字符串文字"的字母"v";每个人";你可以写表情
a[1][1][1]
像一样计算
*( *( *( a + 1 ) + 1 ) + 1 )
表达式可以像一样重写
*( 1 + *( 1 + *( 1 + a ) ) )
然后可以像一样重写
1[1[1[a]]]
这是一个演示程序
#include <stdio.h>
int main( void )
{
char *a[][2] =
{
{ { "Hello" }, { "World" } },
{ { "Hi" }, { "everybody" } }
};
printf( "%ct%cn", a[1][1][1], *( *( *( a + 1 ) + 1 ) + 1 ) );
printf( "%ct%cn", *( 1 + *( 1 + *( 1 + a ) ) ), 1[1[1[a]]] );
}
其输出为
v v
v v