二维数组的初始化,多种多这样的初始化。

今天为啥想写这个呢?因为从自我的体会,就是有很多人学习了c语言很多年,如果有一天让他写一个二维数组的初始化,都会很迷茫,感觉这样也可以,那样也可以,心里面不是很确定。

其实c语言是一个比较靠近硬件设计的语言,也就是c语言很照顾每一个数据在内存怎么摆放的,如果你能理解c语言的二维数组在内存怎么摆放的,那么你也就不会在二维数组的初始化方面迷茫和混沌了。

 

首先讲一下二维对象,这个大家应该都能明白,就是二维方向的数据变换,对于一张图像来说,在数字化图像的概念中,在相机的图像传感器上规定了图像坐标系就是二维的,一般规定左上角为原点,横向为x坐标,纵向为y坐标。

二维对象一般用二维数组存储和表达。二维数组在概念上是二维的,即是说其下标在两个方向上变化,下标变量在数组中的位置也处于一个平面之中,而不是象一维数组只是一个向量。

但是,实际的硬件存储器却是连续编址的,也就是说存储器单元是按一维线性排列的。如何在一维存储器中存放二维数组,可有两种方式:一种是按行排列, 即放完一行之后顺次放入第二行。另一种是按列排列, 即放完一列之后再顺次放入第二列。

在C语言中,二维数组是按行排列的。即,先存放a[0]行,再存放a[1]行,最后存放a[2]行。每行中有四个元素也是依次存放。由于数组a说明为int类型,该类型占两个字节的内存空间,所以每个元素均占有两个字节。这个是基本常识,一般的c语言书中是不提这个的,还是多了解一下。另外硬件的内存,一般重置的时候为0,但是在动态过程中都会被污染,所以,最好初始化的时候给出初始值,或者编译器直接给出初始化值。

 

二维数组一般属于静态分配的内存,在内存空间上一般属于全家变量,一般给出内存空间,不会释放和收回。

 

了解这么多了,你就应该知道怎么初始化一个二维的数组了吧。

例如对数组a[5][3]:

  • 按行分段赋值可写为:
    int a[5][3]={ {80,75,92}, {61,65,71}, {59,63,70}, {85,87,90}, {76,77,85} };
  • 按行连续赋值可写为:
    int a[5][3]={ 80,75,92,61,65,71,59,63,70,85,87,90,76,77,85};

这两种赋初值的结果是完全相同的。

 

可以只对部分元素赋初值,未赋初值的元素自动取0值。例如:

  1. int a[3][3]={{1},{2},{3}};

是对每一行的第一列元素赋值,未赋值的元素取0值。 赋值后各元素的值为:
    1  0  0
    2  0  0
    3  0  0

  1. int a [3][3]={{0,1},{0,0,2},{3}};


赋值后的元素值为:
    0  1  0
    0  0  2
    3  0  0

如对全部元素赋初值,则第一维的长度可以不给出。例如:

  1. int a[3][3]={1,2,3,4,5,6,7,8,9};

可以写为:

  1. int a[][3]={1,2,3,4,5,6,7,8,9};

 

最后在讲一下二维数组和一维数组的关系:
一维数组和二维数组都是数组,数组是一种构造类型的数据。二维数组可以看作是由一维数组的嵌套而构成的。设一维数组的每个元素都又是一个数组,就组成了二维数组。当然,前提是各元素类型必须相同。根据这样的分析,一个二维数组也可以分解为多个一维数组。C语言允许这种分解。


如二维数组a[3][4],可分解为三个一维数组,其数组名分别为:
    a[0]
    a[1]
    a[2]
对这三个一维数组不需另作说明即可使用。这三个一维数组都有4个元素,例如:一维数组a[0]的元素为a[0][0],a[0][1],a[0][2],a[0][3]。必须强调的是,a[0],a[1],a[2]不能当作下标变量使用,它们是数组名,不是一个单纯的下标变量

 

版权声明:本文为happyhorse72原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/happyhorse72/p/14750722.html