符号i[array]在C中是如何工作的



我在任何其他编程语言中都没有遇到过类似的符号,也就是说,我习惯于看到括号内的下标(而不是相反(。我理解给定一个数组foofoo本质上是一个指向数组基地址的指针;以及指针表示法与数组表示法之间的相关性,也就是说,我得到了为什么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

相关内容

  • 没有找到相关文章

最新更新