二维数组
今天对二维数组有了新的感悟 来发发我新的见解 如果有错希望大家及时帮我改正 谢谢大家。
例题
对于二维数组int a[3][4],与&a[2][0]的值相等的是________
A .a + 2 B .a + 8 C .*(a + 2) D .&a[2] E.(int*)(&a)+8
答案为: A C D E
1 #include<stdio.h>
2
3 int main(){
4 int a[3][4];
5 printf("&a[2][0]:%p\n",&a[2][0]);
6 printf("a+2:%p\n",a+2);
7 printf("a+8:%p\n",a+8);
8 printf("*(a+2):%p\n",*(a+2));
9 printf("&a[2]:%p\n",&a[2]);
10 printf("(int*)(&a)+8:%p\n",(int *)(&a)+8);
11 printf("&a+8:%p\n",&a+8);
12 return 0;
13 }
&a[2][0]:0xbf84a820
a+2:0xbf84a820
a+8:0xbf84a880
*(a+2):0xbf84a820
&a[2]:0xbf84a820
(int*)(&a)+8:0xbf84a820
&a+8:0xbf84a980
1.&a[2][0]=&* ( *(a+2)+0)= *(a+2)+0= *(a+2) 我们可以确定选c,
2.a+2=&a[2]=& * (a+2)表示a[2][0]到a[2][3]这整片片内存的首地址。对其+1是增加4*4个字节,由此可以明显知道a+8是错的 选 AD 排除B
a+2:0xbfc677e0
(a+2)+1:0xbfc677f0
3.对于(int *)(&a)+8我们要先理解&a是什么意思
根据下图的我们可以发现差了316=48=34*4字节,即整个数组的间隔,所以我们可以发现&a为a[0][0]—a[2][3]这片内存的首地址
&a:0xbfe81f50
&a+1:0xbfe81f80
然后我们需要理解(int *)(&a)是什么
我们发现强转为int * 后,只能代表a[0][0]的地址了 +1后为为a[0][1]的地址 又由于数据的内存地址是连续的,对其+8即为a[2][0];
(int*)(&a):0xbff48f50
(int *)(&a)+1:0xbff48f54