指针与二维数组

通过代码解释:

int main()

{

int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int *ptr1 = (int*)(&aa + 1);

int *ptr2 = (int*)(*(aa + 1));//6的地址。

        int *ptr3 = (int*)((aa + 1));

        printf("%d,%d", *(ptr1 - 1), *(ptr2 - 1),*(ptr3-1));

 

}

输出答案分别为10,5,5,这是为什么呢,下面是我的理解:

1.  &数组名代表的是整个数组的地址,给&数组名+1,则其指向数组元素中最后一个元素的下一个地址,就本题来说,其指向元素10的下一个地址空间;所以*(ptr1 - 1)==10.

2.  二维数组可以看成是一维数组,如本例中aa[3]={a[0],a[1]}即可以将aa[2][5]看成具有2个元素的一维数组,所以在本题中(aa+1)其指向的是a[1],而指向了a[1]其实就指向了a[1]所代表的一维数组,即也同时指向了数组中的元素6,7,8,9,10,所以(*(aa+1))给(aa+1)解引用之后,它会降级,原来指向的是整个一维数组,现在它指向的是第一个元素。所以*(ptr2-1)==5,*(ptr3-1)==5

其实,我们只要掌握了数组名在不同条件下的含义,我们就可以很灵活的去使用它了。

sizeof(数组名)和&数组名,只有这种情况下,数组名才是数组名,其余的情况,数组名都当地址处理。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值