一道二维数组的指针面试题的理解

int main()
{
    int a[3][4] = { 0 };

由于是一个二维数组,其组成为


    printf("%d\n", sizeof(a));

sizeof(a)就是sizeof(数组名),计算的是整个数组的大小,为3*4*4=48


    printf("%d\n", sizeof(a[0][0]));

sizeof(a[0][0])指的是

又因为该数组是整型数组,一个元素是4个字节,所以答案是4.


    printf("%d\n", sizeof(a[0]));

sizeof(a[0])的内容大致如下

相当于一个sizeof(数组名),所以答案为4*4=16


    printf("%d\n", sizeof(a[0] + 1));

由于sizeof(a[0]+1)不是单独一个sizeof(a[0]),所以sizeof(a[0]+1)中的a[0]本质上是a[0][0]的地址,所以a[0][0]+1为下面的地址,所以答案为4/8.


    printf("%d\n", sizeof(*(a[0] + 1)));

由于不是单独一个a[0]放在sizeof()里面,所以sizeof(*a[0])指的是第一行数组的第一个元素,所以sizeof(*a[0]+1)是指第一行第二个元素,所以答案为4.


    printf("%d\n", sizeof(a + 1));

这里的sizeof(a+1)不是单独一个sizeof(a),所以这里的sizeof(a+1)指的是这个二维数组的第二个元素,也就是二维数组的第二行的地址,由于是地址,所以答案应为4/8


    printf("%d\n", sizeof(*(a + 1)));

我们可知,a+1指的是第二行的地址,但是由于有解引用符号*,所以要对第二行全体元素取出,所以是4*4=16.


    printf("%d\n", sizeof(&a[0] + 1));

&a[0]是第一行的地址,所以&a[0]+1是第二行的地址,由于是地址,所以大小为4/8.
    printf("%d\n", sizeof(*(&a[0] + 1)));

&a[0]+1就是第二行的地址,又因为解引用了,所以取得是第二行全体元素一共是4*4=16
    printf("%d\n", sizeof(*a));

因为不是单独一个a放在sizeof()里面。所以是取得第一个元素,又因为这个是个二维数组,这里面的第一个元素就是第一行,所有为4*4=16


    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值