一维数组与二维数组深度解剖

祥细分析一维数组与多维数组

1、首先我们来看一下一维数组
一维数组的定义:类型名 数组名[元素个数]
    我们知道 编译器会在内存中会根据元素个数和元素数据类型分配一段连续的内存用来保存数据,每一个数据的数据类型都是在定义的时候所指定的类型。
   
    搞清楚内存分配以后,我们现在开始来看怎么去访问这个一维数组呢?
   
    在定义完数组以后,我们所能得到的数组的唯一的信息就是这个数组的名字,所以你的一切关于数组的信息(数据)就全部得从这个数组名出发,通过数组名来操作整个数组 那么问题来了 这个数组名是什么类型呢????
   
     上面已经说了数组名就是为了用来找到数组中的元素的,那么我们不妨先假设数组名是一个地址,显然这时和指针变量的作用不谋而合,因为指针变量也可以通过它的值访问另外一段内存空间,到这里你可能已经假设成立了。数组名代表的是分配那段空间的首地址,它所能访问的类型是你定义数组每个元素的类型!

      我们理解了一维数组的游戏规则以后,来看一下下面几种情况
      (1) int a[10]={1,2,34,5,6};
      (2) char a[20]={1,2,3,4}; or {'a','b','c','d',15};
      (3) int * p; int r=0;int t=1; p=&1; int * a[10]={p,&t};
       (4)  char c; char *p=&c;char * a[5]={"abcde",p};
       (5)  char ** a[5];
       (6)  int ** a[4];
        上述6中情况都是一维数组,别看后面集中情况有点复杂,实际上原理就如上面所说,数组存储的元素类型不同,仅此而已!
             
              (1)式代表的是在内存空间连续分配了4*10=40个字节,分别把1,2,34,5,6存储到内中,后面还有多的内存空间系统自动以0存储。
数组名代表是数组首地址,能够访问的类型是其中的元素int类型,因此毫无疑问,它的类型是int*
              
              (2)式代表的是在内存空间连续分配了1*20=20个字节,    1、分别把1,2,3,4存储到内中,后面还有多的内存空间系统自动以0存储。   2、分别把‘a'(97),'b'(98),'c'(99),'d'(100),15存储到内存中,后面还有多的内存空间系统自动以0存储。
数组名代表是数组首地址,能够访问到的类型是其中的元素char类型,因此毫无疑问,它的类型是int*

              (3)式代表的是在内存空间连续分配了4*10=40个字节(因为元素数据类型是int* 4个字节),分别把p变量(也是int*类型)中的值,以及t的地址存储到内存中,后面还有多的内存空间系统自动以NULL(实际上就是0)存储。  
数组名代表是数组首地址,能够访问到的类型是其中的元素int *类型,因此毫无疑问,它的类型是int**
             
              (4)式代表的是在内存空间连续分配了4*5=20个字节(因为元素数据类型是char* 4个字节),分别把"abcde"代码段中的地址(也是char*类型),以及char*指针变量p的值存储到内存中,后面还有多的内存空间系统自动以NULL(实际上就是0)存储。  
数组名代表是数组首地址,能够访问到的类型是其中的元素char *类型,因此毫无疑问,它的类型是char**
             
               (5)式代表的是在内存空间连续分配了4*5=20(因为元素数据类型是char** 4个字节),
数组名代表是数组首地址,能够访问到的类型是其中的元素char **类型,因此毫无疑问,它的类型是char***
              
                (6)式代表的是在内存空间连续分配了4*4=16(因为元素数据类型是int** 4个字节),
数组名代表是数组首地址,能够访问到的类型是其中的元素int **类型,因此毫无疑问,它的类型是int***
     综上所述,对于所有类型的一维数组来讲,内存存放的是定义时的类型,数组名是一个指针,它能访问的类型是定义的元素类型,它的类型是  --类型* 如以上6式int* char * int ** char ** char ***   int ***
 
看到这里说明已经对于一维数组有了一个较大的认识,但是一维数组还有一个比较重要的东西!
我们以int a[10]为例子:a代表一个指针,指向的是int类型的数据,那么我们想&a是一个什么东西?刚开始,我也不是特别清楚,但是后面和二维数组联系起来以后,就发现其中的奥秘。

2、二维数组
那么现在我们来看一下二维数组的结构与特点,首先看一下二维数组的定义与用法:
       数据类型 数组名[行数][列数] 
       与一维数组类似,二维数组也是在内存中分配一段连续的内存空间,内存中存储的是定义时的数据类型的元素,只不过数组的大小变为行数*列数*sizeof(类型)
       与一维数组类类似,二维数组元素的访问也得从这个数组名出发,那么与一维数组提出相同的问题,它还是不是一个地址,它能访问到的类型又是什么呢?
        首先要想搞清楚二维数组,那么你先得把它理解成一个特殊的一维数组,这个一维数组里面的每一个元素都是一个数组,那么根据我们一开始对于一维数组的讨论与分析,现在仔细想想,这个数组名代表什么,它的类型是什么?
。。。。。。。。。。。。。。。。。
        想了一段时间以后,你是不是有所感觉了,这个数组名是整个内存空间的首地址,它能访问到的数据类型是一个数组,例如你定义一个二维数组int a[5][10]  那么这个数组名能访问到的是int [10] 这么一个数组,那么这时候,数组名的类型是不是已经露出水面了,它的类型是int *[10] ,指向int [10]。      
       
        这个时候我们再来看一维数组最后留下的问题,int a[10]; &a是什么类型? 很显然,与二维数组名的类型比较以后,你也许很快会答出这是一个指向int [10] 的一个指针。因此&a的类型与二维数组名的类型是一致的。
       
        那么我们怎么样来访问其中的元素呢,我们已经知道数组名是一个指向int [10]的指针,那么很显然a[0](*(a+0))代表的是二维数组中第一个一维数组,此时你还没访问到其中的元素,但是你已经很接近访问到其中的元素了,a[0]是二维数组第一个一维数组,相当于你已经得到了这个一位数组的名字了,它的类型是int*  因此我们非常自然的就用a[0][1]这种方式可以访问到二维数组其中的元素。
        再来回顾一下   a[0]代表的是二维数组第一个一维数组,可以理解成是这个一维数组的名字!那你既然得到了一维数组的名字,那么还不能访问到一维数组中的元素吗?答案是非常看定的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值