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