C指针 - 地址运算篇(2)- 二维数组(附讲解)

文章详细解释了如何将二维数组视为一维数组的集合,强调了数组名作为地址的概念,并通过示例展示了sizeof运算符在确定数组大小和元素大小中的应用。同时,文中提供了几个涉及二维数组运算的实例,帮助读者更好地理解和操作二维数组。
摘要由CSDN通过智能技术生成
#include<stdio.h>
int main()
{
    int a[3][4] = {0};
    return 0;
}

如上创建了一个整形元素的二维数组,三行四列,并且元素均初始化为0。

在做一些练习题之前我们先明晰一些二维数组的概念:

        不同的人对二维数组的理解可能并不一致,这里分享一种常见的理解方法:

               将二维数组看作每个元素都是一个一维数组的一维数组。

        例如上边的例程 int a[3][4] 这里我们首先将该数组的 “行” 看作数组的元素个数,“列”看作每个元素的内容,即:

                [3]:该数组有三个元素          [4]:每个元素是一个有四个整形的一维数组

         每个元素是一个整形,数组int [4]是数组类型,那数组名是什么呢?答案是:下标

         所以如果我们想找到第一行第二列的元素,那么可以表示为:a[0]+1,a[0]即是数组名(将二维数组看作一维数组时的第一个元素),数组名是首元素地址,首元素地址加一就得到了第二个元素地址。

        这样的理解方式用运算也是完全没有问题的:

                1、sizeof(a[0]) -- a[0]是数组名,sizeof(数组名)计算整个数组的大小,4*4=16

                2、&a[0] -- &数组名 取出整个数组的地址,在值上与首元素地址相同,但是+1或-1跳过的是整数组大小的地址

        

下面有一些简单的运算来帮助我们理解该二维数组的含义:

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

解析:

        a是该二维数组的数组名,前面的文章也说过,当数组名传给sizeof时,sizeof计算的是整个数组的大小,该数组为整型数组,每个元素大小为4个字节,三行四列则为12个元素,12*4=48。

答案:48

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

解析:

        a[0][0]我们通常理解为第一行第一列的元素,这一点应该没有争议,所以整形元素大小为4,所以答案为4.

答案:4

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

解析:

        将该二维数组看作元素为一维数组的一维数组,a[0]就是第一个元素,也就是数组名,sizeof(数组名)计算整个数组的大小,4*4=16

答案:16

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

解析:

        同理,a[0]是首元素地址,因为没有&符号,所以+1就是向后移动一个整形,指向了第二个元素(第一行第二列),但是其本质还是一个地址,地址的大小为4或者8

答案:4/8

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

解析:

        这里因为我们把该二维数组当作一维数组了,所以a此时就是数组名,即首元素a[0]的地址,a+1就是a[1]的地址,地址的大小为4或8。

答案:4/8

        

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

解析:

        相对于5来说,此时只是加了解引用,因为a+1是a[1]的地址,解引用拿到的就是a[1]这个数组,该数组有4个int类型元素,4*4=16.

答案:16

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值