C 数组元素的不同表示
考虑下面的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].
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;