专题9 二维数组的定义与引用(讲义)-山东省(春季高考)软件与应用技术类《C语言程序设计知识》考纲讲练测
编写说明:本专辑为山东省(春季高考)软件与应用技术类《C语言程序设计知识考纲讲练测》,严格依据山东省春季高考软件与应用技术类专业考试大纲(C语言程序设计部分)编写,精准对标考纲,兼顾考点覆盖与实战应用。每套讲练测提供讲义、课件、练习三大配套教学文件,贯穿九大核心环节:考点解读、思维导图、知识梳理、背诵环节、常考题、模拟题、课堂练习、课堂小结及课后测验,形成“讲-练-测-评”闭环式教学与复习逻辑,助力考生夯实基础、突破重难点。
山东省软件与应用技术类
《C语言程序设计知识考纲讲练测》
专题9 二维数组的定义与引用 讲义
[考点解读]
1.理解二维数组的定义及初始化。
2.掌握二维数组元素的引用。
[思维导图]
[知识梳理]
1.二维数组的定义
(1)前面见过的数组只包含一行数据。实际问题常常是“表”的形状:5 个学生 3 门课的成绩、3 行 4 列的矩阵,这些数据天生有两个方向——行和列。教材在 5.2 节开篇说明:C 语言也支持二维、三维甚至多维数组,较少用到三维以上。二维数组只比一维数组多一个下标,是后面所有“表”形数据处理的基础。
(2)定义方式为:类型说明符 数组名[常量表达式1][常量表达式2];例如 int a[10][5]; float scores[5][3];
学科网(北京)股份有限公司
学科网(北京)股份有限公司
第一个常量表达式表示行数,第二个表示列数。注意两对括号的顺序不能颠倒:int a[3][4] 是 3 行 4 列,int a[4][3] 是 4 行 3 列,元素个数相同、形状不同,下标写法也完全不同。
表9-1 二维数组定义语句的组成
组成部分 | 示例 | 含义与要求 |
类型说明符 | int、float、double | 每个元素的类型,同一数组里全部元素类型相同 |
数组名 | a、scores、c | 命名规则与变量名相同,须遵循标识符命名规则 |
常量表达式1 | 3、M、10 | 第一维长度,即“行数”,必须是常量表达式 |
常量表达式2 | 4、N、5 | 第二维长度,即“列数”,同样必须是常量表达式 |
分号 | ; | 定义语句以分号结束,只分配存储空间,不产生输出 |
说明:比一维数组多一对中括号,前一个表示行数、后一个表示列数,两个都不能省、顺序也不能颠倒。int a[3][4]; 与 int a[4][3]; 空间大小相同,但行数、列数完全不同。
(3)两个中括号里的“常量表达式”规则与一维数组相同:可以是基本常量、符号常量(#define M 3 之后的 M)或由常量组成的表达式(2*2),但不能含变量。教材先写 #define M 3、#define N 5,再写 int c[M][N];,说明这就定义了 M 行 N 列、共 M×N 个元素的数组,相当于 int c[3][5];;改行数或列数只改 M、N 即可。
程序段:二维数组的各种定义写法(只有前四行合法)
int a[3][4]; /* 3 行 4 列,共 12 个元素 */
float scores[5][3]; /* 5 行 3 列,共 15 个元素 */
#define M 3
#define N 5
int c[M][N]; /* M、N 是符号常量 */
int n = 3;
int d[n][4]; /* 非法:长度不能用变量 */
int e[3][]; /* 非法:第二维长度不能省略 */
(4)元素个数=行数×列数,占用字节=行数×列数×每元素字节数:int a[3][4] 有 12 个元素、占 12×4=48 个字节,float scores[5][3] 有 15 个元素、占 60 个字节,double d[3][3] 有 9 个元素、占 9×8=72 个字节。占用空间只与行列数和元素类型有关,与里面存了什么值无关。
表9-2 常见二维数组的行数、列数、元素个数与内存占用
学科网(北京)股份有限公司
学科网(北京)股份有限公司
定义语句 | 行×列 | 元素个数 | 每元素字节 | 占用总字节 |
int a[3][4]; | 3×4 | 12 | 4 | 48 |
float f[2][5]; | 2×5 | 10 | 4 | 40 |
double d[3][3]; | 3×3 | 9 | 8 | 72 |
int b[10][5]; | 10×5 | 50 | 4 | 200 |
说明:元素个数=行数×列数,占用总字节=行数×列数×每个元素的字节数。int a[3][4] 一共占 3×4×4=48 个字节的连续空间;占用空间只与行列数和元素类型有关。
(5)C 语言采用行优先的方式存储二维数组:先在内存中顺序存放第一行(行标为 0)的全部元素,再存第二行,以此类推。以 int c[3][5]; 为例,内存里的顺序是 c[0][0]~c[0][4],接着 c[1][0]~c[1][4],最后 c[2][0]~c[2][4]。记住这条顺序,才能回答“某元素后面紧跟着谁”“偏移多少字节”这类选择题。
表9-3 int a[3][4]; 的行优先存储顺序
存储序号 | 元素 | 行标 | 列标 | 相对首地址的偏移量 |
1 | a[0][0] | 0 | 0 | 0 字节 |
2 | a[0][1] | 0 | 1 | 4 字节 |
3 | a[0][2] | 0 | 2 | 8 字节 |
4 | a[0][3] | 0 | 3 | 12 字节 |
5 | a[1][0] | 1 | 0 | 16 字节 |
12 | a[2][3] | 2 | 3 | 44 字节 |
说明:行优先——先存第一行(行标 0)的全部元素,再存第二行,以此类推,所以 a[0][3] 后面紧跟 a[1][0]。表中只列出前 5 个与最后一个元素,6~11 号依次是 a[1][1]~a[2][2]。偏移量=(行标×列数+列标)×每元素字节数,a[2][3]=(2×4+3)×4=44 字节。
程序段:行优先顺序与地址偏移量(int a[3][4],每元素 4 字节)
int a[3][4];
/* 内存中的先后顺序:*/
/* a[0][0] a[0][1] a[0][2] a[0][3] */
/* a[1][0] a[1][1] a[1][2] a[1][3] */
/* a[2][0] a[2][1] a[2][2] a[2][3] */
/* 偏移量 =(行标 × 列数 + 列标)× 4 字节 */
/* a[1][2] 的偏移 =(1×4+2)×4 = 24 字节 */
/* a[2][3] 的偏移 =(2×4+3)×4 = 44 字节 */
(6)由存储顺序还能看出:二维数组实际上相当于多个一维数组的组合。int c[3][5]; 可看作 c[0]、c[1]、c[2] 这 3 个长度 5 的一维数组组合而成,每一行就是一个一维数组,c[0]、c[1]、c[2] 是这些一维数组的名字。定义这一节收成三句话:两对括号都要有、两个长度都必须是常量、元素按行优先连续存放。
学科网(北京)股份有限公司
学科网(北京)股份有限公司