C语言程序设计课件第10章

上传人:我*** 文档编号:144990318 上传时间:2020-09-15 格式:PPT 页数:31 大小:870.50KB
返回 下载 相关 举报
C语言程序设计课件第10章_第1页
第1页 / 共31页
C语言程序设计课件第10章_第2页
第2页 / 共31页
C语言程序设计课件第10章_第3页
第3页 / 共31页
C语言程序设计课件第10章_第4页
第4页 / 共31页
C语言程序设计课件第10章_第5页
第5页 / 共31页
点击查看更多>>
资源描述

《C语言程序设计课件第10章》由会员分享,可在线阅读,更多相关《C语言程序设计课件第10章(31页珍藏版)》请在金锄头文库上搜索。

1、2020/9/15,1,C语言程序设计,第十章 二维数组与指针,主讲: 计算机学院 朱立华,2020/9/15,3,内容提要,本章介绍二维数组的有关知识: 二维数组的定义,其中涉及的3种类型 二维数组的初始化 二维数组的元素访问方式 与二维数组相关的各类指针: 行指针 列指针 二级指针 一维指针数组 动态二维数组空间的申请与释放(选讲) 如何利用二级指针申请动态二维数组空间 如何依次释放申请的所有动态空间,2020/9/15,4,二维数组的定义,哪里需要二维数组? 类型相同的一组数,如果在序列中只受一种序号标明其在整个序列中的顺序,用一维数组,例如:1门课各个同学的成绩 类型相同的一组数,如果

2、在序列中需要用两种序号标明其在整个序列中的顺序,则要用二维数组,例如:3门课各个同学的成绩 矩阵问题强调元素所在的行、列位置,必须用二维数组 二维数组的定义形式: 类型标识符 数组名整型常量表达式1 整型常量表达式2; 例:int a43;/定义4行3列的整型二维数组,数组名为a,二维数组的元素类型,二维数组名是一个用户自定义标识符,指明二维数组的行数,指明二维数组的列数,2020/9/15,5,二维数组的定义,二维数组的实质分析: 二维数组是一维数组的一维数组(递归定义) 例:int a43; (1)这里,a是二维数组名,也可以理解成是一维数组名a,它有4个元素,分别为a0、a1、a2、a3

3、 (2)a的4个元素不是普通的变量,而是都分别是一维数组,称为行一维数组,每一个都有3个int型元素,例:a0的3个元素为:a00、a01、a02 (3)因此,二维数组a中共有12(4*3)个int型的元素: a00、a01、a02 a10、a11、a12 a20、a21、a22 a30、a31、a32,它们4个称为行一维数组,第1个下标称为行下标,第2个下标称为列下标,这12个元素称为二维数组元素,行数,列数,2020/9/15,6,二维数组的定义,二维数组定义中含有3种类型: 例:int a43; (1)int 43:是二维数组a的类型标识 (2)int 3: 是行一维数组a0a3的类型标

4、识,也是二维数组的基类型 (3)int:是二维数组元素a00a32的类型,也是行一维数组的基类型 二维数组定义中的常量与变量: 例:int a43; (1)二维数组a和行一维数组a0a3均为指针常量 (2)二维数组元素a00a32是int型的变量,2020/9/15,7,二维数组的初始化,二维数组在定义的同时可为其元素赋值,称为初始化,原则:行从左到右依次,每行中列从左到右依次 (1)逐行初始化: int a43=1,2,3,4,5,6,7,8,9,10,11,12; (2)行数可以缺省,列数不能省,自动算行 : int a 3=1,2,3,4,5,6,7,8,9,10,11,12; (3)不

5、分行,用类似一维数组的方式初始化: int a43=1,2,3,4,5,6,7,8,9,10,11,12; (4)初始化数据不足,系统用0补充: int a43=1,2,4,5,7,8,9,10,11,12; (5)最简单的初始化: int a43=0;,每行单独用一对大括号括起,共有两层大括号,只有一层大括号,等效于int a43=1,2,0,4,5,0,7,8,9,10,11,12;,第1个元素初始化为0,其余未初始化的元素值自动为0,行数计算出来为4,不初始化时不能缺少行数,2020/9/15,8,二维数组的初始化,错误的初始化示例: (1)未遵守行从左至右依次初始化原则: int a4

6、3= ,4,5,6,7,8,9,10,11,12; (2)同一行中未遵守列从左至右依次初始化原则: int a43=1, ,3,4,5,6,7,8,9,10,11,12; int a43=1,2,3,5,6,7,8,9,10,11,12; (3)不分行,用类似一维数组的方式初始化,未按顺序: int a43=1,2, ,4, ,6,7,8,9,10,11,12 ; (4)省略列号: int a4 =1,2,3,4,5,6,7,8,9,10,11,12;,第1行没有初始化,后面行就不能初始化,第1行第2列没有初始化,第3列就不能初始化,第2行第1列没有初始化,第2、3列就不能初始化,二维数组初始

7、化中列号一定不能省略,2020/9/15,9,二维数组元素的访问,0i 3 0 j 2,二维数组元素可随机访问,因为每个元素地址可计算 Loc(aij)=a+(i*m+j)*sizeof(二维数组元素类型),数组元素的表示形式:例:int a43; (1)最常用的是下标(行、列)法:aij (2)间接引用法与下标法结合: *(ai+j)、 (*(a+i))j (3)间接引用法: *(*(a+i)+j) 二维数组元素在内存中的存储形式:先行后列依次,行下标,列数,列下标,2020/9/15,10,二维数组元素的访问,一般要对所有的数组元素执行同样的操作,与一维数组类似,用循环结构控制,二维数组需

8、用两层循环 例:int a43,n=1,i,j; for(i=0;i4;i+) for(j=0;j3;j+) aij=n+; 程序10.1 将如下所示的矩阵存入二维数组,然后照原样输出,最后按转置形式输出。 算法提示:转置输出不需要另外定义二维数组,只是在控制循环时先控制列下标再控制行下标,2020/9/15,11,二维数组与一维数组,二维数组名是二维数组指针常量 如果按照递归的概念,它也是特殊的一维数组指针 例:int a43; (1)指针a的基类型为int3,a指向a0,即a= = 这里指针d的基类型为double,而指针(/行指针变量p int a43=1,2,3,4,5,6,7,8,9

9、,10,11,12; p=a;/将二维数组指针赋值给行指针变量 此时行指针变量p等价于二维数组指针a,有以下等价式: p+i= =a+i pi= =aipij= =aij,对应于二维数组元素类型,对应于二维数组的列数,还可以:p=a+i或p= (2)void Display( int pa3,int row); (3)void Display( int pa43,int row); 后两种本质上就是第一种形式,且后两种形式只能出现在形参表中,不能作为行指针变量的定义(或声明)形式,2020/9/15,17,二维数组与列指针,一个m行n列二维数组,可以看作是长度为m*n的一维数组,因此二维数组可

10、以传址给列指针 例:int a43; 则a0(或*a或则 pi*3+j=aij 这样,二维数组也可以通过将其起始列地址传给一个一级指针变量来访问所有的元素,行下标,列数,列下标,2020/9/15,18,二维数组与列指针,程序10.6 寻找矩阵中的马鞍点。一个矩阵中的元素,若在它所在的行中最小,在它所在的列中最大,则称为马鞍点。求一个n*m阶矩阵的所有马鞍点。 算法思想:用一个 n行m列二维数组a来存储矩阵,一个长度为n的一维数组min存储每行中的最小元素,一个长度为m的一维数组max存储每列中的最大元素。 寻找马鞍点的具体方法是:用行控制外层循环,在i行其行中最小元素为min i,在行固定的

11、情况下,用列控制内层循环,用每一列的最大元素值maxj与当前行的mini去比较,如果二者相等,则说明一个二维数组元素aij就是马鞍点。 显然,一个矩阵中可能不止一个马鞍点,也有可能没有马鞍点。马鞍点元素加括号输出。,2020/9/15,19,一维指针数组与二级指针,所谓一维指针数组,就是数组元素为一级指针变量的一维数组。 例:char* a5; a是长度为5的一维字符型指针数组,a是指针常量,一维数组元素a0、a1、a2、a3、a4都是一级字符型指针变量,它们各自可以指向一维字符数组,特别是字符串 对每个元素(一级指针变量)都可以赋值:a0=File; a1=Edit; a2=Compile;

12、 a3=Run; a4=Tools; 也可以在定义一维指针数组时进行初始化,如普通一维数组 char* a5=File,Edit,Compile,Run,Tools; 或char* a=File,Edit,Compile,Run,Tools;,注意:此处不能加括号:而char(*a)5是1个行指针定义,2020/9/15,20,一维指针数组与二级指针,一维指针数组名可以赋值给何种类型的变量? 回顾:一级指针变量与一维数组的关系 Type arraysize;/数组array的元素类型为Type ,即数组指针的基类型为Type Type* p; /指针变量p的基类型为Type 因此:p=arra

13、y; /指针变量p指向数组array 如果有指针数组定义:char* a5,则数组a的元素类型是char*,即数组指针常量a的基类型是char*,则接受a值的指针变量的基类型也应该是char*,故该指针变量类型是char*,称为(字符型)指针的指针,也称二级指针 于是:char *pa=a; 这时,pai与ai等效,都是指向某一个字符串的首地址,pa为二级指针变量,a为一维指针数组名,2020/9/15,21,一维指针数组与二级指针,程序10.7 主函数中定义指针数组处理多个字符串,函数以指针的指针为形参输出所有字符串的值。 输出函数原型:void Display( char* pa,int

14、n); 另一种形式:void Display(char* pa ,int n); 二级指针、一级指针与普通变量的关系: 例: char ch=A;/定义一个普通字符型变量 char* p= /二级指针变量q指向了一级指针p 则对字符值的访问形式有等效的3种形式:ch、*p、*q,如下图所示,这种形式的形参本质上就是char* pa,2020/9/15,22,一维指针数组与二维数组,一维指针数组是元素为一级指针变量的一维数组。每一个一级指针变量可以分别指向长度不同、且彼此空间不相邻的一维数组。 二维数组是元素为一级指针常量的一维数组。每一个指针常量分别指向长度相同、彼此空间相邻的一维数组,例:

15、char cColor47=“white”,”red”,”orange”,”pink”; char *pColor4= “white”,”red”,”orange”,”pink”; cColor是二维数组,其元素为cColor0cColor3,它们都是长度为7的字符型一维数组,且在内存中连续存放 pColor是一维指针数组,其元素为pColor0pColor3,它们都是一级指针变量,可以指向各独立存放的串首地址,2020/9/15,23,一维指针数组与二维数组,cColor,cColor0,cColor1,cColor2,cColor3,pColor,pColor0,pColor1,pColo

16、r2,pColor3,white0,red0,orange0,pink0,这4个字符串长度相等地址相邻,这4个字符串长度不相等地址不一定相邻,多个字符串的处理,既可以用二维字符数组,又可以用一维指针数组,后者是更常用的处理方式。,2020/9/15,24,一维指针数组与二维数组,指针数组的每一个元素作为指针变量,可以指向二维数组的行数组,当然,要保证基类型的一致性。 前面的例示中,可以用以下循环实现赋值: for (i=0;i4;i+) pColori=cColori; 程序10.8 指针数组和二维数组。 用二维整型数组存储一个矩阵,通过一维指针数组输出矩阵 指针数组的元素是指针变量,不仅可以指向静态数组 也可以指向动态数组 例:int* p4,i; for (i=0;i4;i+) pi=(int*)malloc(3*sizeof(int);,2020/9/15,25,二维动态空间的申请与释放(选讲),一级指针可以申请动态一维数组空间,同理,二级指针可以申请动态二维数组空间,需要分两步走: 用二级指针申请动态二维

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号