【问题标题】:How does the notation i[array] work in C? [duplicate]符号 i[array] 在 C 中如何工作? [复制]
【发布时间】:2021-01-27 23:56:48
【问题描述】:

我在任何其他编程语言中都没有遇到过类似的表示法,也就是说,我习惯于在括号内看到下标(而不是相反)。我了解如何给定数组foofoo 本质上是指向数组基地址的指针;以及指针符号如何与数组符号相关,即我明白为什么foo[i], *(foo + i), *(i + foo) 都是等价的背后的基本原理......但我不明白i[foo] 背后的基本原理如何也等同于上述三个,或者它如何作品。也许用英语改写这个符号会有所帮助,但我不知道该怎么做。

【问题讨论】:

  • 问问自己,“7[arrayname] 有什么可能的替代含义?” K&R,决定它没有任何区别,所以不妨让它成为社区。​​span>
  • 我认为它在 K&R 书中有所解释 - a[b] 只是 *(a+b) 的 语法糖,它显然是可交换的。
  • @computronium 不是任意的,它在资源中进行了解释。 a[i]*(a+i)*(i+a)i[a]

标签: c pointers multidimensional-array implicit-conversion c-strings


【解决方案1】:

根据 C 标准(6.5.2.1 数组下标)

2 后缀表达式后跟方括号 [] 中的表达式 是数组对象元素的下标名称。这 下标运算符 [] 的定义是 E1[E2] 等同于 (*((E1)+(E2)))。由于适用于 二进制 + 运算符,如果 E1 是一个数组对象(相当于一个指针 到数组对象的初始元素)并且 E2 是一个整数, E1[E2] 表示 E1 的第 E2 个元素(从零开始计数)。

所以由于操作的交换性质+你可以写

a[i]

要么

*( a + i )

或喜欢

i[a]

让我们考虑下面的多维数组声明

char * a[][2] =
{
    { { "Hello" }, { "World" } },
    { { "Hi" }, { "everybody" } }
};

要访问字符串文字 "everybody" 的字母 'v',您可以编写 en 表达式

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( "%c\t%c\n", a[1][1][1], *( *( *( a + 1 ) + 1 ) + 1 ) );
    printf( "%c\t%c\n", *( 1 + *( 1 + *( 1 + a ) ) ), 1[1[1[a]]] );

}

它的输出是

v       v
v       v

【讨论】:

  • 非常感谢您说明了多维数组是如何分解的。再好不过了。
猜你喜欢
  • 2012-02-10
  • 1970-01-01
  • 1970-01-01
  • 2015-08-21
  • 1970-01-01
  • 2019-01-01
  • 2020-08-24
相关资源
最近更新 更多