版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、9.1 了解二维数组了解二维数组 9.2 二维数组的简单应用二维数组的简单应用 9.3 利用地址和指针访问二维数组利用地址和指针访问二维数组 9.4 二维数组名作函数的实参二维数组名作函数的实参 9.5 二维数组操作中的常用算法介绍二维数组操作中的常用算法介绍 与一维数组一样,二维数组也必须先与一维数组一样,二维数组也必须先 定义,然后才可以使用。定义语句的形式定义,然后才可以使用。定义语句的形式 如下:如下: 类型名类型名 数组名数组名常量表达式常量表达式1 常量表达式常量表达式2,; 二维数组的定义形式与一维数组相似,二维数组的定义形式与一维数组相似, 所不同的是增加了一个用方括号括起来的
2、所不同的是增加了一个用方括号括起来的 常量表达式。这里常量表达式常量表达式。这里常量表达式1用来指定二用来指定二 维数组的行数;常量表达式维数组的行数;常量表达式2用来指定二维用来指定二维 数组的列数。由于数组的列数。由于c语言规定了数组下标语言规定了数组下标 值的下限一律为值的下限一律为0,所以二维数组行下标的,所以二维数组行下标的 上限为常量表达式上限为常量表达式1的值减的值减1;列下标的上;列下标的上 限为常量表达式限为常量表达式2的值减的值减1。 前面提到的存放前面提到的存放4名学生名学生3门课成绩的门课成绩的 二维数组可定义如下:二维数组可定义如下: int s43; 此语句表明:这
3、是一个名为此语句表明:这是一个名为s的的4行行3列列 的二维数组;数组中一共可以存储的二维数组;数组中一共可以存储43个个 整型数据;数组行下标的范围是整型数据;数组行下标的范围是03,列,列 下标的范围是下标的范围是02。它在逻辑结构上可以。它在逻辑结构上可以 看作以下形式的矩阵(或表格):看作以下形式的矩阵(或表格): 第第 0列列第第 1列列第第 2列列 第第 0行行 s00s01s02 第第 1行行 s10s11s12 第第 2行行 s20s21s22 第第 3行行 s30s31s32 二维数组中的元素在逻辑上可以看作二维数组中的元素在逻辑上可以看作 构成了一个矩阵,但在物理上仍旧占据
4、的构成了一个矩阵,但在物理上仍旧占据的 是一串连续的存储单元。这些元素在内存是一串连续的存储单元。这些元素在内存 中的排列顺序是中的排列顺序是“按行按行”存放,即:先放存放,即:先放 第第0行的元素,再放第行的元素,再放第1行的元素,依次类行的元素,依次类 推。推。 如有定义:如有定义: int x23; 则数组则数组x在内存中的存储结构如图在内存中的存储结构如图9-1 所示:所示: 图图9-1 二维数组存储结构示意图二维数组存储结构示意图 二维数组每个元素都具有一个名字二维数组每个元素都具有一个名字 带有双下标的变量。它的一般表示形式带有双下标的变量。它的一般表示形式 为:为: 数组名数组名
5、下标表达式下标表达式1下标表达式下标表达式2 如 图如 图 9 - 1 中 所 标 出 的中 所 标 出 的 x 0 0 、 x01、 这里每一维的下标都可以是这里每一维的下标都可以是 整型的常量、变量或表达式。如:整型的常量、变量或表达式。如:xij、 x0j+1等都是合法的。注意:等都是合法的。注意:c语言中二语言中二 维数组元素的两个下标是分别放在两个方维数组元素的两个下标是分别放在两个方 括号中的,不要误写成括号中的,不要误写成x0,0、xi,j这种非这种非 法形式。法形式。 二维数组元素的引用与一维数组相同,二维数组元素的引用与一维数组相同, 也能够参与同类型变量允许的所有操作。也能
6、够参与同类型变量允许的所有操作。 例如:例如: scanf(%d, /* 输入输入 */ x10=x00; /* 赋值赋值 */ if (x0010) /* 条件判断条件判断 */ 而语句:而语句:x23=0;则是错误的。因为则是错误的。因为 在定义语句中限定了在定义语句中限定了x数组是一个数组是一个23的数的数 组,其行下标最大值为组,其行下标最大值为1,列下标最大值为,列下标最大值为 2。上述引用造成了下标越界。同样是。上述引用造成了下标越界。同样是 x23,初学者要注意区分它出现在定义,初学者要注意区分它出现在定义 语句中和元素引用时的不同含义。语句中和元素引用时的不同含义。 与一维数组
7、一样,可以在定义二维数与一维数组一样,可以在定义二维数 组的同时为其元素赋初值。组的同时为其元素赋初值。 int x34= 1,2,3,4, 5,6,7,8, 9,10,11,12 ; 这种形式比较规范和直观:最外层有一对花这种形式比较规范和直观:最外层有一对花 括号,在其内部,每一行元素的初值分别括在一括号,在其内部,每一行元素的初值分别括在一 对花括号中,中间用逗号分隔。对花括号中,中间用逗号分隔。 int x34= 1, 2, 3 ; 赋值后,赋值后,x数组中各元素的值为:数组中各元素的值为: 1 0 0 0 2 0 0 0 3 0 0 0 显然,当某一行花括号内初值个数少显然,当某一行
8、花括号内初值个数少 于该行的元素个数时,系统自动补以初值于该行的元素个数时,系统自动补以初值0。 又如:又如: int x34= 1,2, 3,4 ; 赋值后,数组元素值为:赋值后,数组元素值为: 1 2 0 0 3 4 0 0 0 0 0 0 也就是说,当行花括号少于数组的行也就是说,当行花括号少于数组的行 数时,系统自动为后面的各行补以初值数时,系统自动为后面的各行补以初值0。 int x34=1,2,3,4,5,6,7,8,9,10,11,12; 这里只保留了最外侧的花括号,而省这里只保留了最外侧的花括号,而省 略了用来界定行元素的花括号。此时,系略了用来界定行元素的花括号。此时,系 统
9、将按照数组元素在内存中的排列顺序,统将按照数组元素在内存中的排列顺序, 依次将数据赋给各个元素。依次将数据赋给各个元素。 若数据的个数少于元素的个数,系统若数据的个数少于元素的个数,系统 将自动为其赋初值将自动为其赋初值0。例如:。例如: int x34=1,2,3; 赋值后的数组元素值为:赋值后的数组元素值为: 1 2 3 0 0 0 0 0 0 0 0 0 在定义二维数组时,可以省略第在定义二维数组时,可以省略第1个个 方括号中的常量表达式方括号中的常量表达式1,但不允许省略第,但不允许省略第 2个方括号中的常量表达式个方括号中的常量表达式2。例如:。例如: int x 4= 0,2, 3
10、,5,6, 7 ; 以上语句所赋初值中带有以上语句所赋初值中带有3个用来界个用来界 定行元素的花括号对。因此,省略的第一定行元素的花括号对。因此,省略的第一 维的大小就是维的大小就是3。它等价于:。它等价于: int x34= 0,2, 3,5,6, 7 ; 也可以省略行花括号对,采用以下赋也可以省略行花括号对,采用以下赋 值形式:值形式: int y 4=1,2,3,4,5,6; 由于第二维(列数)是确定的,初值由于第二维(列数)是确定的,初值 个数给定了,第一维(行数)的大小就是个数给定了,第一维(行数)的大小就是 惟一的。惟一的。 计算方法是:计算方法是: 用初值个数(用初值个数(6)除
11、以第二维的大)除以第二维的大 小(小(4);); 若能除尽,商就是第一维的大小;若能除尽,商就是第一维的大小; 否则商数否则商数+1是第一维的大小。是第一维的大小。 此例中此例中y数组第一维的大小应是数组第一维的大小应是2,以,以 上定义语句等价于:上定义语句等价于: int y24=1,2,3,4,5,6; 例例9.2 2 编程为编程为55的二维数组的左下的二维数组的左下 半三角依次赋自然数半三角依次赋自然数115,其余元素为,其余元素为0。 输出形式如下:输出形式如下: 1 0 0 0 0 2 3 0 0 0 4 5 6 0 0 7 8 9 10 0 11 12 13 14 15 问题分析
12、问题分析 对二维数组元素的访问通常都是在双对二维数组元素的访问通常都是在双 重循环中进行的。通过控制循环变量的初重循环中进行的。通过控制循环变量的初 值、终值和增量的变化,从而控制数组下值、终值和增量的变化,从而控制数组下 标的变化,以实现有规律的访问二维数组标的变化,以实现有规律的访问二维数组 中的部分元素。如:左下角、左上角、右中的部分元素。如:左下角、左上角、右 下角、右上角、对角线等。下角、右上角、对角线等。 源程序如下:源程序如下: main( ) int n55=0,i,j,k=1; for(i=0; i5; i+) for(j=0; j=i; j+) nij=k+; for(i=
13、0; i5; i+) for(j=0; j5; j+) printf(%3d,nij); printf(n); 程序中先通过定义时的初始化使数组程序中先通过定义时的初始化使数组 n中的内容为全中的内容为全0。再通过双重循环为数组。再通过双重循环为数组 的左下半三角赋值。赋值的内容(自然数的左下半三角赋值。赋值的内容(自然数 115)由变量)由变量k通过每次自增通过每次自增1提供。需赋提供。需赋 值的元素有这样的规律:每行需要赋值的值的元素有这样的规律:每行需要赋值的 元素个数与行数有关,第元素个数与行数有关,第1行行1个元素、第个元素、第2 行行2个元素,个元素,所以,内循环变量所以,内循环变
14、量j的循的循 环条件是环条件是j=i。当。当 i=0时(第时(第1行),行),j的变的变 化是化是00,内循环执行,内循环执行1次(给次(给1个元素赋个元素赋 值);当值);当 i=1时(第时(第2行),行),j的变化是的变化是01, 内循环执行内循环执行2次(给次(给2个元素赋值);个元素赋值); 与一维数组类似,访问二维数组中的与一维数组类似,访问二维数组中的 元素,不仅可以使用带有双下标的下标变元素,不仅可以使用带有双下标的下标变 量形式,也可以通过地址和指针的形式来量形式,也可以通过地址和指针的形式来 实现。实现。 有如下定义:有如下定义: int a34, *p; 接触过其他高级语言
15、的读者可能已经接触过其他高级语言的读者可能已经 注意到:与其他语言不同,注意到:与其他语言不同,c语言在定义语言在定义 二维数组和引用二维数组元素时,都使用二维数组和引用二维数组元素时,都使用 了两组独立的方括号。这不仅仅是表示形了两组独立的方括号。这不仅仅是表示形 式上的差别,它反映出了式上的差别,它反映出了c语言中二维数语言中二维数 组的特殊性质。组的特殊性质。 c语言中的二维数组可以被看作是一语言中的二维数组可以被看作是一 种特殊的一维数组,这个一维数组中的每种特殊的一维数组,这个一维数组中的每 个元素又是一个一维数组。例如,可以把个元素又是一个一维数组。例如,可以把 上面定义的数组上面
16、定义的数组a看作是一个一维数组,它看作是一个一维数组,它 由由3个特殊元素个特殊元素a0、a1和和a2组成,而这组成,而这 3个元素又分别是包含有个元素又分别是包含有4个整型元素的一个整型元素的一 维数组。其关系如图维数组。其关系如图9-2所示。所示。 图图9-2 二维数组与一维数组、数组元素的关系示意图二维数组与一维数组、数组元素的关系示意图 在在8.3节中已介绍过:数组名是一个地节中已介绍过:数组名是一个地 址常量,它代表的是数组的首地址。那么址常量,它代表的是数组的首地址。那么 作为二维数组名的作为二维数组名的a和作为其元素的一维数和作为其元素的一维数 组名组名a0、a1、a2之间是个什
17、么样的关之间是个什么样的关 系呢?系呢? 结合图结合图9-2可以看出数组名可以看出数组名a与与a0、 p=ai; p=*(a+i); 以上语句都是合法的。因为指针以上语句都是合法的。因为指针p的的 基类型为整型,与基类型为整型,与ai的基类型相同。的基类型相同。 而:而:p=a;则是非法的,因为它们的基则是非法的,因为它们的基 类型不同。那么,什么样的指针才能存放类型不同。那么,什么样的指针才能存放 像二维数组名这样的地址常量呢?像二维数组名这样的地址常量呢?那那 就是行指针。就是行指针。 设有如下定义:设有如下定义: int a34,(*pr)4; 此处定义的指针变量此处定义的指针变量pr是
18、一个行指针,是一个行指针, 它可以指向包含它可以指向包含4个整型元素的一维数组。个整型元素的一维数组。 注意:定义行指针时注意:定义行指针时*pr外侧的一对圆括号外侧的一对圆括号 不能省略,否则下标运算符不能省略,否则下标运算符 的优先级高的优先级高 于于*,pr先与先与4结合,代表的将是指针数结合,代表的将是指针数 组。组。 行指针行指针pr的基类型与数组名的基类型与数组名a相同,相同, 因此赋值语句:因此赋值语句:pr=a;是合法的。执行以上是合法的。执行以上 赋值操作后,表达式赋值操作后,表达式pr+1就等价于就等价于a+1, 它们加它们加1时的增量都是以一维数组的长度为时的增量都是以一
19、维数组的长度为 单位的,这里是单位的,这里是4个整型元素。在使用中所个整型元素。在使用中所 不同的是:不同的是:pr是指针变量,它的值可以改是指针变量,它的值可以改 变;变;a是地址常量,它的值不容更改。例如:是地址常量,它的值不容更改。例如: 语句语句pr+;使使pr指向了指向了a数组的第二行;而数组的第二行;而 语句语句a+;则是非法的。则是非法的。 在上一节中,我们讨论了表示二维数在上一节中,我们讨论了表示二维数 组元素地址的几种常见形式,显然,通过组元素地址的几种常见形式,显然,通过 地址就可以访问到数组元素。也就是说,地址就可以访问到数组元素。也就是说, 若有定义:若有定义: int
20、 a34i,j; 访问二维数组元素远不止访问二维数组元素远不止aij这一种这一种 形式。通过地址引用二维数组元素的常见形式。通过地址引用二维数组元素的常见 形式有:形式有: (1)*(ai+j) (2)*(*(a+i)+j) (3)(*(a+i)j 为保证数组不越界,其中为保证数组不越界,其中i和和j的取值的取值 应满足条件:应满足条件:0i3,0j4。 有以下定义:有以下定义: int a34,*pa3,i; 定义语句中的定义语句中的pa首先与首先与3结合,表明结合,表明 它是一个具有它是一个具有3个元素的一维数组,个元素的一维数组,pa前面前面 带有带有*号,说明数组中的每个元素都是基类号
21、,说明数组中的每个元素都是基类 型为整型的指针。所以称型为整型的指针。所以称pa为指针数组。为指针数组。 可以通过以下循环使指针数组与二维可以通过以下循环使指针数组与二维 数组建立联系:数组建立联系: for(i=0; j3; i+) pai=ai; 因为因为ai与与pai具有相同的基类型(整具有相同的基类型(整 型),赋值后,指针数组型),赋值后,指针数组pa的元素依次指的元素依次指 向了数组向了数组a每行的起始地址。每行的起始地址。 其关系如图其关系如图9-3所示。所示。 从图中可以看出:从图中可以看出:pa0中存放的是中存放的是 a00的地址,的地址,pa0+1等价与等价与a0+1,增,增 量量1代表的是一个整型单元(代表的是一个整型单元(2个字节),个字节), 所以表达式所以表达式pa0+1代表的也就是代表的也就是a01的的 地址。地址。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 汽车融资租赁市场信用风险深度剖析与化解之道
- 汽车回收政策对报废汽车回收率的影响:基于多维度视角的深度剖析
- 沥青混凝土路面施工工艺及平整度控制措施
- 新教材人教版七年级数学下学期期中测试卷
- 商品房抵押状态告知协议
- 大模型微调辅助技师考试试卷及答案
- 2026年老年医学考试真题及答案
- 2026年企业宣传片制作方案
- 2026年异地就医结算考试真题及参考答案
- 2026年医疗机构病理科安全操作规范
- 二年级上册道法大单元全册教案
- SPC地板项目可行性研究报告-范文
- 小学课堂管理方法与技巧
- 《研学旅行课程设计》课件-1研学课程学生手册设计
- ISO27001最新版信息风险评估表
- 核电厂职业危害分析报告
- 写字楼物业各项应急预案
- 基于无人机的公路基础设施健康监测与安全预警系统设计
- 连云港市花果山风景区管理处2023年招聘工作人员笔试参考题库(共500题)答案详解版
- 市场监管总局直属事业单位招聘考试题库2023
- 从性别文化视角看网络文学中的男性生育题材
评论
0/150
提交评论