在内存中,数组的分布是一维线性的,整个数组占用一块连续的内存
连续性、同类型、顺序存储、可以通过下标去访问每一个成员
5.1 一维数组
-
一维数组 定义 -->数据类型 数组名[常量表达式] -> int arry[17]
-
数组名 表示 内存首地址 是地址常量
-
编译时分配连续内存,内存字节数 = 数组元素个数*sizeof(元素数据类型)
-
数组是连续的,所以可通过下标找到对应值,下标可以是产量或整型表达式
-
C语言不对数组作越界检查,使用时注意
-
int型数组,未赋值时,[0]位存值 0
-
sizeof(a)/sizeof(int)元素个数,初始化方式,int a[5] = {0};//a[0]的值为0,其余值默认为0,不初始化,其元素值为随机数
-
只要初始化时有值,剩余空位默认为0
-
-
对 static 数组元素不赋初值,系统自动赋值0, 只给部分数组元素赋初值
-
当全部数组元素赋初值时,可不指定数组长度,编译系统可根据初值个数确定数组长度
5.2 二维数组
-
数组名【行】【列】 元素 = 行*列
-
存放顺序:按行优先连续存储 , 内存为一维
-
声明时,若未初始化数组,行列数不可缺省,若初始化数组,行数可缺省;
-
当赋值语句里没有用{}分出行的时候,系统会按照 元素的个数除以列数 来算出每一行的元素个数,如果这时候有缺省值赋值的话,就是依次排列;
-
当赋值语句里用 {} 分出行,如果这时候缺省值赋值的话,按行补0、二维数组 s1 [ i ] [ j ] , s1[0] → 是第0行的首地址
-
二维数组存字符串时,每行应以 '\0' 结束,不然输出时,会越界,越界时读取的地址会不确定,非连续读取;
-
数组名 a 是看做 二级指针 ,用 int *p 接收二维数组首地址时,应该 p = *a 非 p = a ;
-
a == a[0] --> *a == &a[0] [0] --> **a == a[0] [0]
-
记忆 --> 一个 * 破除 一个 { };
-
-
a+1 与 a[0]+1的区别
-
a为二级指针,加一的数量级是一排
-
a[0]为一级指针,加一的数量级是一个
-
-
二维数组的存储
-
C语言中的二维数组是按行排列的,也就是先存放a[0]行,再存放a[1]行,最后存放a[2]行;每行中的4个元素也是依次存放。数组a为int类型,每个元素占用4个字节,整个数组共占用4×(3×4)=48个字节。C语言允许把一个二维数组分解成多个一维数组来处理。对于数组a,它可以分解成三个一维数组,也就是a[0]、a[1]、a[2]。每一个一维数组又包含了4个元素,比如a[0]包含a[0] [0]、a[0] [1]、a[0] [ 2]、a[0] [3]。
-
设数组a中第0个元素的地址为1000,那么每个一维数组的首地址如下图所示:

-

4万+

被折叠的 条评论
为什么被折叠?



