C 数组元素的不同表示

C 数组元素的不同表示,c,arrays,C,Arrays,考虑下面的C代码 int a[]={1,2,3,4}; printf("%d",2[a]); 这是“3”,怎么可能呢?我知道a[2]a是数组的基址,但在2[a] 什么是2?它是如何访问数组a的?我完全不明白数组的这种表示法。这里有两件事需要记住: *(expr1+expr2) is equivalent to expr1[expr2] or expr2[expr1]. *(expr2+expr1) is equivalent to expr2[expr1] or expr1[expr2].

考虑下面的C代码

int a[]={1,2,3,4};
printf("%d",2[a]);
这是“3”,怎么可能呢?我知道a[2]a是数组的基址,但在2[a]
什么是2?它是如何访问数组a的?我完全不明白数组的这种表示法。

这里有两件事需要记住:

*(expr1+expr2) is equivalent to expr1[expr2] or expr2[expr1].

*(expr2+expr1) is equivalent to expr2[expr1] or expr1[expr2].
  • 首先,数组访问基本上只是使用指针算法的一种奇特方式。例如,如果您有数组

    int a[10];
    
    然后

    等于

    *(a + 3) = 5;
    
  • 第二件要记住的事情是加法(就像上面的
    a+3
    一样),因此
    a+3
    3+a
    相同。这导致了

    *(3 + a) = 5;
    
    这可以解释为

    3[a] = 5;
    

这只是写入数组元素的另一种方式

inta[]={1,2,3,4},索引3处的元素可通过多种方法引用:

  • 作为数组元素:
    a[3]
  • 使用指针:
    *(a+3)
    *(3+a)
    [加法在算术和C中是可交换的]
  • 现在,您可以使用指针将第二种表示方式写成
    3[a]
    ,即
    a[3]
    等于
    *(a+3)
    等于
    *(3+a)
    等于
    3[a]

  • inta[]={1,2,3,4}
    是一个包含4个元素的整数数组,
    a
    是基址,让基址用
    X
    表示。现在
    a[1]
    表示地址处的元素
    X
    +
    sizeOf(int)*2
    =
    Y
    (假设)即地址处的元素
    Y
    ,同样
    2[a]
    表示地址处的元素
    sizeOf(int)*2
    *
    X
    =
    Y

    因此,即使您编写
    a[2]
    2[a]
    ,编译器最终也会将其识别为
    Y
    ,并引用地址
    Y
    处的元素,在本例中,它是
    3


    希望它能正确地解决问题。

    复制品@devnull捕捉得很好!我必须承认我不知道答案。@Floris看着,我必须说我不相信你。@devnull这是真的:我是一个自学成才的黑客;因此,我偶尔会有真正深度的区域,以及其他完全的盲点。这就是为什么我经常在这个网站上闲逛。。。但是,是的,这是一个我仍然感觉很好的答案:-)
    3[a] = 5;