面向对象程序设计第8讲二维指针结构体.ppt
2023/10/31,1,多维数组及数组应用,赵红,2023/10/31,2,作业,写出程序运行结果。用行指针操作二维数组,找出最大值。void main()int a23=1,2,9,4,5,6;coutprint(a,2,3)endl;P167自测题7.5P164例7.5,本周上机测试结构体,2023/10/31,3,例如:比较两个字符串的大小。写出运算结果,#include#include void main()char s1=aBC,s2=abc;if(strcmp(s1,s2)=0)cout0)couts2;else couts1s2;,程序输出结果:s1s2,思考:若有语句if(s1=s2)printf(s1=s2);比较的是什么?,2023/10/31,4,x0是数组名,是元素x00的地址,x1是数组名,是元素x10的地址,二维数组可看作是一种特殊的一维数组,x0-x00,x01,x02,x1-x10,x11,x12,例如,可以把x数组看作是包含二个元素的一维数组,每个元素又是一个含有三个元素一维数组。x为行指针,x0为元素指针,2023/10/31,5,二维数组的地址 例如:int a34;二维数组名a是数组的首地址。二维数组a包含三个行元素:a0、a1、a2。,三个行元素的地址分别是:a、a+1、a+2。而a0、a1、a2也是地址量,是一维数组名,即*(a+0)、*(a+1)、*(a+2)是一维数组首个元素地址。,10.3 指针与数组,10.3.1 指向数组的指针,2.二维数组的指针,2023/10/31,6,二维数组元素的地址 a0、a1、a2是一维数组名,所以ai+j是数组元素的地址。,数组元素aij的地址可以表示为下列形式:&aij、ai+j、*(a+i)+j,10.3 指针与数组,10.3.1 指向数组的指针,2.二维数组的指针,2023/10/31,7,二维数组元素的表示法 数组元素可用下列形式表示:aij、*(ai+j)、*(*(a+i)+j),10.3 指针与数组,10.3.1 指向数组的指针,2.二维数组的指针,a 是二维数组,根据C的地址计算方法,a经过两次*操作才能访问到数组元素。所以*a 是 a0,*a 才是 a00。a0是a00的地址,*a0是a00。,2023/10/31,8,int x23=0,1,2,10,11,12;int(*lp)3,*q;lp=x;q=x0;,10.3 指向数组的指针,指向一维数组的指针变量的定义形式:数据类型标识符(*变量名)元素个数,lp+;,q+;,cannot convert from int 23 to int*,2023/10/31,9,【例10.6】用指向一维数组的指针变量输出数组元素。#include void main()int a34=0,1,2,3,10,11,12,13,20,21,22,23;int(*lp)4,j;for(lp=a;lpa+3;lp+)for(j=0;j4;j+)cout*(*lp+j);coutendl;,10.3 指针与数组,10.3.1 指向数组的指针,2.二维数组的指针,0 1 2 3,10 11 12 13,20 21 22 23,2023/10/31,10,指针数组定义的一般形式:数据类型标识符*数组名元素个数;在这个定义中由于“”比“*”的优先级高,所以数组名先与“元素个数”结合,形成数组的定义形式,“*”表示数组中每个元素是指针类型,“数据类型标识符”说明指针的目标变量的数据类型。例如:int*ip10;char*cp5;,10.7 指针与数组,10.7 指针数组,1.指针数组的定义,指针数组就是数组中的每个元素均为指针类型,2023/10/31,11,例如:P191char c48=Fortran,COBOL,BASIC,Pascal;char*cp4=c0,c1,c2,c3;char*str5=int,long,char,float,double;,2023/10/31,12,8.3 指针与函数,2.数组的指针作函数参数,二维数组的指针作函数参数,二维数组的行指针作函数参数 例如被调函数abc的定义形式有以下三种:void abc(int b24)void abc(int b 4)void abc(int(*b)4)在主调函数有如下定义:int a24,(*p)4=a;则调用abc函数时可用 abc(a)或 abc(p),8.3.3 指针变量作函数参数,2023/10/31,13,7.2.4 二维数组应用举例(续),【作业2】有一个NM矩阵,编程序求出其中最大的那个元素的值及其所在的行、列位置。,图7.6 查找最大元素,2023/10/31,14,#define N 2#define M 3main()int i,j,row,colum,max,aNM;/*输入数据*/max=a00;row=colum=0;for(i=0;imax)max=aij;row=i;colum=j;/*输出数据*/,程序运行情况如下:34 56 12 12 67 43 max=67,row=1,colum=1,2023/10/31,15,作业:,1、读P160例7.42、求一个2行3列的二维数组的转置数组。3、有一个NM矩阵,编程序求出其中最大的那个元素的值及其所在的行、列位置。4、从键盘接收数据并存入数组a10,并调用函数sort(a,n)对其进行排序,在主程序中输出结果。(排序方法不限)5、编写两个子函数:insert(a,n,i,x)完成在第i个位置上插入数据x,del(a,n,i)完成删除数组中第i个位置的元素。,2023/10/31,16,一个学生的信息有学号、姓名、性别、年龄、住址、成绩等。一本图书的信息有分类编号、书名、作者、出版社、出版日期、价格、库存量等。如何描述这些类型不同的相关数据?,结构体与结构体类型的定义,?,信息管理,结构体一种构造类型数据 结构体由若干不同类型的数据项组成,构成结构体的各个数据项称为结构体成员。,第7章 结构体P162,2023/10/31,17,struct 结构体名 数据类型1 成员名1;数据类型2 成员名2;数据类型n 成员名n;,结构体,结构体与结构体类型的定义,结构体类型定义的一般形式:,struct为关键字;结构体名是用户定义的类型标识。中是组成该结构体的成员。成员的数据类型可以是C语言所允许的任何数据类型。,2023/10/31,18,例如学生类型的定义:struct student char num8;/*学号是字符数组类型*/char name30;/*姓名是字符数组类型*/char sex;/*性别是字符型*/int age;/*年龄是整型*/char addr60;/*住址是字符数组类型*/int score6;/*成绩是整型数组类型*/;,结构体,结构体与结构体类型的定义,2023/10/31,19,结构体,结构体类型与变量的说明,类型与变量是不同的概念。应先定义一个结构体类型,而后再定义结构体变量。系统对类型不分配空间,仅对变量分配空间。只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算。,成员也可以是结构变量。P167,成员名可与程序中的变量名相同时,也可与不同结构体类型的成员名相同,二者代表不同的对象。,2023/10/31,20,struct date int year,month,day;struct student char num8;char name30;char sex;date birthday;/*成员为结构体类型*/char addr60;int score6;,用sizeof运算符计算结构体变量所占内存空间sizeof(date),2023/10/31,21,“.”是分量运算符,运算级别最高。,结构体,结构体变量成员的引用,结构体变量成员引用的一般形式:结构体变量名.成员名,结构体变量a的各成员可分别表示为a.num、a.name、a.sex、a.birthday、a.score,struct date int year,month,day;struct student char num8,name20,sex;struct date birthday;float score;student a;,a.birthday.yeara.birthday.montha.birthday.day,2023/10/31,22,结构体P163,结构体变量的定义与初始化,在定义结构体类型的同时定义变量,例如:struct student char num8,name20,sex;int age;float score;student st1,st30;,struct 结构体名 成员定义表;结构体名 变量名表;,2023/10/31,23,结构体,结构体变量的赋值运算,同类型结构体变量之间的赋值运算,结构体变量之间进行赋值时,系统将按成员一一对应赋值。,struct date int year,month,day;struct student char num8,name20,sex;struct date birthday;float score;date a=9606011,Li ming,M,1977,12,9,83,b,c;c=a;,2023/10/31,24,结构体指针,2.结构体成员的三种引用形式,用结构体变量名的引用形式:d.year d.month d.day,struct date int year,month,day;date d,*p=,用结构体指针变量的引用形式:(*p).year(*p).month(*p).day p-year p-month p-day,“-”是指向结构体成员运算符,优先级为一级,p=&d.year,2023/10/31,25,结构体,结构体的指针,【例】分析自增自减运算对程序结果的影响。struct code int i;char c;a=100,A,200,B,300,C,400,D;,2023/10/31,26,结构体,结构体的指针,void main()struct code*p=a;couticici+i endl;,p,101,D,301,101,B,200,D,300,301,2023/10/31,27,作业,写出程序运行结果。用行指针操作二维数组,找出最大值。void main()int a23=1,2,9,4,5,6;coutprint(a,2,3)endl;P167自测题7.5P164例7.5,本周上机测试结构体,