一,数组的基本知识
1,数组是由基本数据类型按照一定规则组成的,称其为构造数据类型。
2,构造数据类型包括数组,结构体,共用体等,使用构造数据类型可以求解更为复杂的问题。
3,数组是最基本的构造类型,是相同类型数据的有序集合。
4,数组中的元素在内存中连续存放,用数组名和下标可以唯一地确定数组元素。
兄弟们,废话不多说,我们直接进入正题。
二,一维数组的地址存储方式
如下图所示:
我们先用int类型创建并初始化i,a[10],将数组a[10]分配到内存中。
(分配到内存地址中去,一般是随机分配的)
然后用while循环开始输出数组a的内存中所表示的地址名。
(&为取地址运算符,您在使用scanf函数中应该经常使用。)
大家看!这一行行,有没有发现规律呢?
我们能看到最后两列他们相隔4个差值(这些数为16进制),为什么只会相差4个呢?
注意:大家看一下前面我标的int类型(int类型所占字节为4个字节)
这说明在数组a中里面每个元素都占4个字节,而数组a的下标为10,则10*4=40个字节。
从而得出我们创建的数组a在内存中开辟了10个空间并且每个空间所占4个字节
接下来我们瞅瞅下面这副图,以便更好的观察与理解。
有些小伙伴可能不知道,我们创建的数组在内存中是以线性方式存储的。
不仅一维数组这样,二维数组,多维数组也是如此……
三,二维数组的地址存储方式
如下图所示:
我们先用int类型创建并初始化i,j.
先用char类型创建并初始化a[8][90],将数组a[8][90]分配到内存中。后用for循环开始输出数组a的内存中所表示的地址名。
大家请看方向箭头:在上面一节我们说过不仅一维数组为线性方式存储在内存中,就算是二维数组,多维数组也是如此!
能看出来在数组a[0][9]与a[1][0]的两个地址差和在同一列a[0][1]与a[0][2]差值为一样的。
我们一开始理解的二维数组是这样的:
有行有列,有些小伙伴就会想会不会这就跟我们数学一样,一维为线,二维为面,三维为立体的同样存储方式。
小知识:我们把a[0][1]中的[0]称为行,把[1]称为列。
我们来用一幅图来解释输出地址的那副图,来更清晰的理解:
a[0]表示包括a[0][1]到a[0][9]在内的大集合里面都是小的子集,
而在第0行末和在第1行初的地址他们却是连续的,这说明他们在内存中是连续的。
我们初始化数组的时候是这样的a[i][j]={ {1,2,3,4}, {5,6,7,8}, {9,10,11,12} }。
与图中类似,但图中表示为在一条线中挑出一段一段为数组中的行。
而每一段当中的每一小段就可以理解为放置单个数的行中的列(例如:a[0]中的a[0][1])
以上总结:
数组是由基本数据类型按照一定规则组成的构造数据类型。它是最基本的构造类型,是相同类型数据的有序集合。数组中的元素在内存中连续存放,用数组名和下标可以唯一地确定数组元素。
一维数组的地址存储方式是线性存储,每个元素占用固定大小的字节。二维数组的地址存储方式也是线性的,行与行之间的地址差值与列与列之间的地址差值是一样的。
还有一点,大家可以学习一下:使用图形的话,可以更好地观察和理解 数组在内存中的存储方式。