C语言程序设计课件第章.ppt
《C语言程序设计课件第章.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计课件第章.ppt(30页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第十章第十章二维数组二维数组和指针和指针与二维数组相关的各类指针与二维数组相关的各类指针 二维数组的初始化及元素访问方式二维数组的初始化及元素访问方式二维数组的定义二维数组的定义, ,其中涉及的其中涉及的3 3种类型种类型本章介绍二维数组的有关知识本章介绍二维数组的有关知识动态二维数组空间的申请与释放动态二维数组空间的申请与释放( (选讲选讲) )二级指针二级指针列指针列指针行指针行指针一维指针数组一维指针数组利用二级指针申请动态二维数组空间利用二级指针申请动态二维数组空间如何依次释放申请的所有动态空间如何依次释放申请的所有动态空间重点难点提示重点难点提示重点难点提示重点难点提示二维数组的定义
2、与使用二维数组的定义与使用二维数组与行指针二维数组与行指针二维数组与列指针二维数组与列指针动态动态演示演示动态动态演示演示二维数组与指针数组二维数组与指针数组动态动态演示演示动态动态演示演示n哪里需要二维数组?哪里需要二维数组?类型相同的一组数类型相同的一组数, ,如果在序列中如果在序列中只受一种序号标明只受一种序号标明其在整其在整个序列中的顺序个序列中的顺序, ,用用一维数组一维数组, ,例如例如: :1 1门课各个同学的成绩门课各个同学的成绩 类型相同的一组数类型相同的一组数, ,如果在序列中需要用如果在序列中需要用两种序号标明两种序号标明其在其在整个序列中的顺序整个序列中的顺序, ,则要
3、用则要用二维数组二维数组, ,例如例如: :3 3门课各个同学的门课各个同学的成绩成绩矩阵问题强调元素所在的行、列位置矩阵问题强调元素所在的行、列位置, ,必须用必须用二维数组二维数组n二维数组的定义形式:二维数组的定义形式: 类型标识符类型标识符 数组名数组名 整型常量表达式整型常量表达式1 1 整型常量表达式整型常量表达式22; 例:例:int a43int a43;/定义定义4 4行行3 3列的整型二维数组,数组名为列的整型二维数组,数组名为a a 二维数组的二维数组的元素类型元素类型二维数组名是一个用二维数组名是一个用户自定义标识符户自定义标识符指明二维数指明二维数组的行数组的行数指明
4、二维数指明二维数组的列数组的列数n二维数组的实质分析:二维数组的实质分析:二维数组是二维数组是一维数组的一维数组(递归定义)一维数组的一维数组(递归定义)例:例:int a43;int a43;(1)(1)这里,这里,a a是二维数组名是二维数组名,也可以理解成是,也可以理解成是一维数组名一维数组名a a,它有它有4 4个元素,分别为个元素,分别为a0a0、a1a1、a2a2、a3a3(2)a(2)a的的4 4个元素不是普通的变量,而是都分别是一维数组,个元素不是普通的变量,而是都分别是一维数组,称为称为行一维数组行一维数组,每一个都有,每一个都有3 3个个intint型元素型元素,例:,例:
5、a0a0的的3 3个元素为个元素为:a00:a00、a01a01、a02a02(3)(3)因此,二维数组因此,二维数组a a中共有中共有1212(4 4* *3 3)个个intint型的元素:型的元素:a00a00、a01a01、a02a02a10a10、a11a11、a12a12a20a20、a21a21、a22a22a30a30、a31a31、a32a32它们它们4个称为个称为行一维数组行一维数组第第1个下标个下标称为行下标称为行下标第第2个下标个下标称为列下标称为列下标这这1212个元素称为个元素称为二维数组元素二维数组元素行数行数列数列数n二维数组定义中含有二维数组定义中含有3 3种类
6、型种类型: :例:例:int a43;int a43;(1 1)int 43int 43:是二维数组:是二维数组a a的类型标识的类型标识(2 2)int 3:int 3: 是行一维数组是行一维数组a0a3a0a3的类型标识,也是的类型标识,也是二维数组的基类型二维数组的基类型(3 3)int:int:是二维数组元素是二维数组元素a00a32a00a32的类型,也是的类型,也是行一维数组的基类型行一维数组的基类型n二维数组定义中的二维数组定义中的常量与变量常量与变量: :例:例:int a43;int a43;(1 1)二维数组)二维数组a a和行一维数组和行一维数组a0a3a0a3均为均为指
7、针常量指针常量(2 2)二维数组元素)二维数组元素a00a32a00a32是是intint型的型的变量变量n二维数组在定义的同时可为其元素赋值,称为初始化,二维数组在定义的同时可为其元素赋值,称为初始化,原则:行从左到右依次,每行中列从左到右依次原则:行从左到右依次,每行中列从左到右依次(1 1)逐行初始化逐行初始化: int a43=1,2,3,4,5,6,7,8,9,10,11,12; (2 2)行数可以缺省,列数不能省,自动算行行数可以缺省,列数不能省,自动算行 : : int a 3=1,2,3,4,5,6,7,8,9,10,11,12; (3 3)不分行,用类似一维数组的方式初始化不
8、分行,用类似一维数组的方式初始化: :int a43=1,2,3,4,5,6,7,8,9,10,11,12; (4 4)初始化数据不足,系统用初始化数据不足,系统用0 0补充:补充: int a43=1,2,4,5,7,8,9,10,11,12; (5 5)最简单的初始化最简单的初始化: int a43=0; 每行单独用一每行单独用一对大括号括起对大括号括起共有两层大括号共有两层大括号只有一层大括号只有一层大括号等效于等效于int a43=1,2,0,4,5,0,7,8,9,10,11,12;第第1个元素初始化为个元素初始化为0,其余未,其余未初始化的元素值自动为初始化的元素值自动为0行数计算
9、出来为行数计算出来为4,不初始化时不能缺少行数,不初始化时不能缺少行数n错误的初始化示例错误的初始化示例: :(1 1)未遵守行从左至右依次初始化原则未遵守行从左至右依次初始化原则: int a43= ,4,5,6,7,8,9,10,11,12; (2 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 3)不分行,用类似一维数组的方式初始化,未按顺序不分行,用类似一维数组的方式初始化,未按顺序: :int a43
10、=1,2, ,4, ,6,7,8,9,10,11,12 ;(4 4)省略列号省略列号: :int a4 =1,2,3,4,5,6,7,8,9,10,11,12;中间缺少两个元素,不符合中间缺少两个元素,不符合从左到右依次的原则从左到右依次的原则第第1 1行没有初始化,后行没有初始化,后面行就不能初始化面行就不能初始化第第1 1行第行第2 2列没有初始化,列没有初始化,第第3 3列就不能初始化列就不能初始化第第2 2行第行第1 1列没有初始化,第列没有初始化,第2 2、3 3列就不能初始化列就不能初始化二维数组初始化中列二维数组初始化中列号一定不能省略号一定不能省略a00 a01a02 a10
11、a11 a12 a20 a21 a22 a30 a31 a320i 30 j 2a0a1a2a3n二维数组元素可随机访问,因为每个元素地址可计算二维数组元素可随机访问,因为每个元素地址可计算Loc(aij)=a+(iLoc(aij)=a+(i* *m+j)m+j)* *sizeof(sizeof(二维数组元素类型)二维数组元素类型)n数组元素的表示形式:数组元素的表示形式:例:例:int a43;int a43;(1 1)最常用的是下标(行、列)法)最常用的是下标(行、列)法:aijaij(2 2)间接引用法与下标法结合)间接引用法与下标法结合: : * *(ai+j)(ai+j)、 (* *
12、(a+i)(a+i))jj(3 3)间接引用法)间接引用法: : * *( (* *(a+i)+j)(a+i)+j)n二维数组元素在内存中的存储形式二维数组元素在内存中的存储形式: :先行后列依次先行后列依次行下标行下标列数列数列下标列下标n一般要对所有的数组元素执行同样的操作,与一维数一般要对所有的数组元素执行同样的操作,与一维数组类似,用循环结构控制,二维数组需用两层循环组类似,用循环结构控制,二维数组需用两层循环例:例:int a43,n=1,i,j;int a43,n=1,i,j;for(i=0;i4;i+)for(i=0;i4;i+)for(j=0;j3;j+)for(j=0;j3;
13、j+)aij=n+;aij=n+;n程序程序10.110.1 将如下所示的矩阵存入二维数组,然后照将如下所示的矩阵存入二维数组,然后照原样输出,最后按转置形式输出。原样输出,最后按转置形式输出。 算法提示算法提示:转置输出不需要另外定义二维数组转置输出不需要另外定义二维数组,只是在控制循只是在控制循环时先控制列下标再控制行下标环时先控制列下标再控制行下标动动态态演示演示过过程程n二维数组名二维数组名是是二维数组指针二维数组指针常量常量n如果按照递归的概念如果按照递归的概念, ,它也是特殊的一维数组指针它也是特殊的一维数组指针 例:例:int a43;int a43; (1)(1)指针指针a a
14、的基类型为的基类型为int3,aint3,a指向指向a0,a0,即即a= =&a0,a= =&a0, 因此因此a+ia+i指向指向ai,ai,即:即:a+i=&ai,a+i=&ai,a+ia+i或或&ai&ai称为称为行指针行指针 地址计算公式为地址计算公式为: a+i=a+ i*sizeof (二维数组元素类型二维数组元素类型*列数列数) (2)(2)指针指针a aii的基类型为的基类型为intint,aiai指向元素指向元素ai0,ai0, 即即ai= =&ai0,ai= =&ai0, 因此因此ai+jai+j指向元素指向元素aij,aij,即即: ai+j= =&aij,: ai+j=
15、=&aij, aiai、* *(a+i)(a+i)、ai+jai+j或或&aij&aij称为称为列指针列指针或或一维指针一维指针 地址计算公式为地址计算公式为: ai+jai+j =ai+j*sizeof (二维数组元素类型二维数组元素类型)0i3n一级指针一级指针也称为也称为列指针列指针或或一维指针一维指针,这是一级指针在,这是一级指针在针对行指针或二维数组指针时的称谓针对行指针或二维数组指针时的称谓n程序程序10.210.2 二维数组行指针和列指针的区别二维数组行指针和列指针的区别提示:提示:a a与与a0a0的值虽然相等,但基类型不同,因此注意比的值虽然相等,但基类型不同,因此注意比较较
16、a+1a+1与与a0+1a0+1的不同值的不同值 (在(在VC+VC+下演示程序)下演示程序)n结论结论1 1:一个一个m m行行n n列的二维数组可以作为长度为列的二维数组可以作为长度为m m* *n n的的一维数组,一维数组,二者在内存中的存储顺序一致二者在内存中的存储顺序一致n程序程序10.310.3 把二维数组当作一维数组输出把二维数组当作一维数组输出 算法提示算法提示:用一层循环而不是二层循环控制,注意换行条件用一层循环而不是二层循环控制,注意换行条件动动态态演示演示过过程程n结论结论2 2:一个长度为一个长度为n n的一维数组可以作为的一维数组可以作为1 1行行n n列二维列二维数
17、组数组n例如:例如:double d5=1,2,3,4,5;double d5=1,2,3,4,5;n这里指针这里指针d d的基类型为的基类型为double,double,而指针而指针(& &d d)的基类型的基类型是是double5double5(参看(参看5.2.35.2.3节),相当于节),相当于1 1行行5 5列二维双列二维双浮点型数组指针浮点型数组指针 n程序程序10.410.4 一维数组可以看作行数为一维数组可以看作行数为1 1的二维数组。的二维数组。算法提示算法提示: ( & &一维数组名一维数组名) 相当于二维数组名相当于二维数组名动动态态演示演示过过程程注意:这里的注意:这里
18、的括号不能少括号不能少n含义一:含义一:整个二维数组变量空间的名称整个二维数组变量空间的名称, ,在执行字节在执行字节计算计算sizeofsizeof和取址运算和取址运算& &时,时,a a就是整个二维数组空间就是整个二维数组空间标识符,即二维数组变量的名称标识符,即二维数组变量的名称 例:例:int a43,int a43,则则a a的类型为的类型为int 43int 43sizeof(a)sizeof(a)的值是的值是4848,&a+1&a+1比比&a&a大大48 48 n含义二:含义二:行一维数组指针,称为行一维数组指针,称为二维数组指针二维数组指针,也称,也称行指针行指针,因为数组变量
19、不能通过其名称直接引用数组,因为数组变量不能通过其名称直接引用数组元素,因此二维数组名称元素,因此二维数组名称“退化退化”了,大部分时候都了,大部分时候都是这一含义。是这一含义。n二维数组要传址,可以传递二维数组要传址,可以传递二维数组指针二维数组指针n二维数组指针的二维数组指针的基类型基类型由由二维数组元素类型和列数二维数组元素类型和列数两两部分部分联合表示联合表示n因此,接受二维数组指针的指针变量,其基类型也应因此,接受二维数组指针的指针变量,其基类型也应该由两部分联合表示,而且对应的部分完全一致,这该由两部分联合表示,而且对应的部分完全一致,这样的指针变量称为样的指针变量称为行指针变量行
20、指针变量 例:例:intint ( (* *p)p)33; ;/行指针变量行指针变量p p intint a4 a433=1,2,3,4,5,6,7,8,9,10,11,12;=1,2,3,4,5,6,7,8,9,10,11,12; p=a;p=a;/将二维数组指针赋值给行指针变量将二维数组指针赋值给行指针变量 此时行指针变量此时行指针变量p p等价于二维数组指针等价于二维数组指针a a,有以下等价式:有以下等价式: p+i= =a+ip+i= =a+i pi= =ai pi= =aipij= =aijpij= =aij 对应于二维数对应于二维数组元素类型组元素类型对应于二维对应于二维数组的列
21、数数组的列数还可以:还可以:p=a+ip=a+i或或p=&ai,p=&ai,保证保证p p得到的是行指针都是正确的得到的是行指针都是正确的此处的括号此处的括号一定要有一定要有! !n程序程序10.510.5 将给定矩阵按转置形式输出。将给定矩阵按转置形式输出。本程序与程序本程序与程序10.210.2功能类似,但作了简化,二维数组元素功能类似,但作了简化,二维数组元素初初始化始化给定,不需要输出原始矩阵。给定,不需要输出原始矩阵。本程序用本程序用DisplayDisplay函数实现矩阵转置输出函数实现矩阵转置输出重点理解如何用重点理解如何用行指针变量行指针变量作为形参接受二维数组实参。作为形参接
22、受二维数组实参。n注意:注意:此题的函数原型可以有以下三种等效表示:此题的函数原型可以有以下三种等效表示: (1 1)void Display( void Display( int (int (* *pa)3,pa)3,int row);int row); (2 2)void Display( void Display( int pa3,int pa3,int row);int row); (3 3)void Display( void Display( int pa43,int pa43,int row);int row); 后两种本质上就是第一种形式,且后两种形式只能出现在形后两种本质上就
23、是第一种形式,且后两种形式只能出现在形参表中,不能作为参表中,不能作为行指针变量行指针变量的定义(或声明)形式的定义(或声明)形式 动动态态演示演示过过程程n一个一个m m行行n n列二维数组,可以看作是长度为列二维数组,可以看作是长度为m m* *n n的一维的一维数组数组, ,因此二维数组可以因此二维数组可以传址给列指针传址给列指针例:例:int a43;int a43; 则则a0a0(或(或* *a a或或&a00&a00)是指向第)是指向第1 1个二维数组元素个二维数组元素a00a00的指针常量,它等价于长度为的指针常量,它等价于长度为1212的的一维整型数组指一维整型数组指针针,该一
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 课件
限制150内