二维数组见解

二维数组

今天对二维数组有了新的感悟 来发发我新的见解 如果有错希望大家及时帮我改正 谢谢大家。

例题

 对于二维数组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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值