2021-06-12

                                                    理清二维数组

       学习了二维数组,一直感觉理不清头绪,静下心来翻看了书籍资料,总算理清了,最让我不解的地方也解开了谜团。这里纪录一下,也给同样有疑问的同学提供点帮助,大家也少走一点弯路。

首先定义一个二维数组,简单一点吧,就写一个arr[2][3],并初始化它。程序如下。

int num[2][3] = {{1,2,3},
                {4,5,6}};

       一维数组比较好理解,这里略过,到了二维,先初步理解为2行三列的一个数组。那这边的数组名num到底是什么呢?里面存储的又是啥呢?,一维数组的数组名是首元素的地址,那同样分析一下,可以把  num[2]  看做一个一维数组,里面有两个元素,这两个元素分别叫做 num[0]    num[1],这两个元素是啥呢?究竟是地址还是值?另外num又是啥呢?带着这个疑问先写一段代码来验证看看。

 18 ¦   for(i = 0;i < 2;i++)
 19 ¦   {
 20 ¦   ¦   for(j = 0;j < 3;j++)
 21 ¦   ¦   {
 22 ¦   ¦   ¦   ¦   printf("a[%d][%d] = %d ",i,j,num[i][j]);
 23 ¦   ¦   }
 24 ¦   ¦   printf("\n");                                                                                            
 25 ¦   }

 26 ¦   printf("**num = %d\n",**num);
 27 ¦   printf("&num = %p\n",&num);
 28 ¦   printf("num = %p\n",num);
 29 ¦   printf("num[0] = %p\n",num[0]);
 30 ¦   printf("*num[0] = %d\n",*num[0]);




a[0][0] = 1 a[0][1] = 2 a[0][2] = 3 
a[1][0] = 4 a[1][1] = 5 a[1][2] = 6 
**num = 1
&num = 0xbfa4cd10
num = 0xbfa4cd10
num[0] = 0xbfa4cd10
*num[0] = 1

        通过上面的代码可以清晰的看到  1 二维数组名是个二级指针  其**取值为首元素的值      2 num[0]    num[1]  是储存的两个地址    并且根据取值可以推断分别是第一行,第二行的首元素的地址。由以上可以初步得到一个结果了,那就是二维数组名是一个二级指针,里面存储着每行数组的首元素的地址。也就是这样一个数组   num[2]  =  {num[0],num[1]};    注意,这里的num【0】,num【1】又分别是两个一维数组,每个数组里面有三个元素。num【0】,num【1】整体是数组名,也就是首元素的地址。

       这里分析结束已经基本可以理清这个二维数组的情况了。其实就是里面有两个一维数组,或者叫两行,每行是一个一维数组,每个一维数组里面储存着3个元素,也就是三列。num [0],num[1]代表着一维数组名,也就是首元素的地址,因此二维数组名num里面存储的就是两个地址,分别是num[0],num[1],二维数组名num 就是个二级指针。

好了分析完毕,带着这个分析再写一段代码验证下

 32 ¦   printf("*num[0] + 1 = %d\n",*(num[0] + 1));  
 33 ¦   printf("**(num + 1) = %d\n",**(num + 1));    
 34 ¦   
 35 ¦   printf("num[1] + 1 = %p\n",num[1] + 1);
 36 ¦   printf("*(num + 1) + 1 = %p\n",*(num + 1) +1);
 37 ¦   
 38 ¦   printf("*num[1] + 1 = %d\n",*(num[1] + 1));
 39 ¦   printf("*(*(num + 1) + 1) = %d\n",*(*(num + 1) +1));

*num[0] + 1 = 2
**(num + 1) = 4
num[1] + 1 = 0xbfa4cd20
*(num + 1) + 1 = 0xbfa4cd20
*num[1] + 1 = 5
*(*(num + 1) + 1) = 5

以上代码大部分由以上分析可以清晰的看出,我最初有疑惑的其实是最后两行

38 ¦   printf("*num[1] + 1 = %d\n",*(num[1] + 1));
 39 ¦   printf("*(*(num + 1) + 1) = %d\n",*(*(num + 1) +1));

不过现在也很清晰了,num 由于是二级指针,里面存储的是每行的首地址,num是首地址的地址,因此num+1就是里面的第一行的首地址的地址,*(num+1)取出了第二行地址首元素的地址,再加一就是第二个元素的地址了,*(*(num+1) +1)就取到值了。

不知道对大家有没有帮助,还有疑惑的建议直接看c  primary plus中关于数组和指针的那部分。

       再补充一点吧,其实c语言中并没有数组这种类型,c把数组定义为派生类型,也就是建立在其他类型的基础之上,所以不可以简单的声明一个数组,而是必须说明其元素类型,如  int 型还是 float 型,或者别的类型,所谓其他类型也可以是数组类型,这就很好的解释了所谓的二维数组其实是数组的数组。

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值