指针、结构体及引用.ppt_第1页
指针、结构体及引用.ppt_第2页
指针、结构体及引用.ppt_第3页
指针、结构体及引用.ppt_第4页
指针、结构体及引用.ppt_第5页
已阅读5页,还剩62页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1,第 6章 指针、结构体及引用,6.1 指针类型 6.2 指针变量的操作(运算) 6.3 指针运算实例 6.4 数组或指针作为函数参数 6.5 指针与内存动态分配 6.6 指针与数组 6.7 选择排序算法 6.8 按字典序排列名表 6.9 结构体类型 6.10 建立一个人员档案链表 6.11 指向函数的指针变量 6.12 返回指针值的函数 6.13 带参数的main函数 6.14 引用,2,6.7 选择排序算法 - 参看书p136的6.1节,实现功能: 将数组list中的n个数按照从大到小的顺序排好之后再输出它们(此n个数通过使用函数rand来自动产生)。 程序执行后的显示结果具有如下的样式

2、: = listi - generated by rand() function = 21763 12517 18730 13389 28672 15043 16724 6088 14820 30552 22287 9573 4321 11810 19894 1444 25548 6572 8307 1684 = sorted result - listi = 30552 28672 25548 22287 21763 19894 18730 16724 15043 14820 13389 12517 11810 9573 8307 6572 6088 4321 1684 1444,3,#in

3、clude /use “rand” #include /use “cout” #include /use “time” void ssort (float*, int); /函数原型 void main() /注意,书p136的主函数不完整 const int n=20; int i; float listn; /n个排序数据放于list数组中 srand(unsigned)time(NULL); /使产生的随机数与当前时间“time”相关,4,cout= listi - generated by rand() function =endl; for(i=0; in; i+) listi=ra

4、nd(); /0-65535的随机数 coutlisti ; if(i+1)%10=0) /10数一行 coutendl; ,5,ssort(list, n); /注意数组参数list所起的“双向传值”作用 coutendl= sorted result - listi =endl; /将排序结果(被函数ssort改变后的list数组数据)显示出来 for(i=0; in; i+) coutlisti ; if(i+1)%10=0) coutendl; ,6,void swap1(float* a, float* b) /将指针a指向的数据与指针b指向的数据互换 float temp; tem

5、p=*a; *a=*b; *b=temp; ,7,void ssort(float* a, int m)/选择排序 /负责将m个float数据(a指针指向该m个数据的首数据)由大到小排序 int i,j,index; float elem; /elem记录当前最大元 for(i=0; ielem) elem=*(a+j);index=j; swap1(a+i, a+index); /将index处的最大元调到第i号处 ,8,6.8 按字典序排列名表 - 参看书p153-156,6.5.1节,已知n个人的姓名, 以及他(她)们每个人的一个电话号码(本程序将它们放于具有同样大小的name数组与te

6、le数组中)。编程序实现:将这些人名按字典序(“由小到大”)排列之后连同其电话号码一并输出。 使程序执行后的显示结果如下: NAME TELE NO Liguoping 12345678 Mazhigang 26532347 Mazilan 39070909 Sunyingming 86861232 Zhaolin 99882345,9,#include #include void swap(char* /tele及name均为具有n个指针元素的数组 /(书p154通过cin输入各telei之值) /sele在排序时记录name中当前“最小”元素,10,coutsetw(15)NAMEsetw

7、(15)TELE NO; for(i=0; in-1; i+) /选择排序 /i等于0的循环使name数组0号位置的元素交换为“最小” /i等于1的循环使1号位置元素交换为“次小”;。 sele=namei; index=i; for(j=i+1; jn; j+) if(compword(namej,sele) /namejsele? 后面的更小吗? sele=namej; index=j; swap(nameindex, namei); swap(teleindex, telei); ,11,for(i=0; in; i+) /将已排好序的结果输出 coutendl setw(14); co

8、utsetiosflags(ios:left); coutnameitelei; coutendl; ,12,void swap(char* ,13,bool compword(char* a, char* b) /比较二字符串大小,按字典序ab则返1即true(书p155为int型) while(*a != 0 /注意,此时至少有一个串已结束(短者优先) ,14,6.9 结构体类型 - 参看书p157的6.5.2节中有关说明,1. 基本概念及一般使用方法 1) 自定义结构体类型: struct ; . ; ;,15,2) 说明结构体类型的变量:, ,.,; 如:struct MyStuden

9、tType1 char name20; int age; double score; ; MyStudentType1 li, ma, softCla40; MyStudentType1 *pStru1, *pStru2;,16,3) 使用结构体分量: . 如: li.age softCj (*pStru1).age 或 pStru1-age,17,4) 若说明某个分量为指向本结构体的指针,则可结合使用new来形成一个链表 如:struct MyStudentType char name20; double score; MyStudentType1 * nex

10、t; ; MyStudentType *head, *tail, *temp; tail = head = NULL; /使head及tail均指向“空”,表示空链表 int n; cinn;,18,for(i=0; inext=NULL;/新项将充当链表末项 . /如,通过cin输入(*temp)结构体的其它各分量等 if(head=NULL)/链表为空时 head=tail=temp;/新项既为首项又为末项 else /链表非空时 tail-next=temp;/新项加入到末项之后 tail=temp;/新项成为新的末项 ,19,/遍历链表(对链表的各项内容进行处理) temp=head;

11、 while(temp!=NULL) /基于我们已将链表末项的next域置成了NULL . /如, 通过cout输出(*temp)结构体除next外的各分量值 temp=temp-next; /使temp指向下一个链表项 ,20,5) 对结构体还可进行如下一些操作与使用: . 结构体的定义可以嵌套,即是说,结构体的某分量还可以是结构体。 . 同类型的结构体变量间可以相互赋值。 . 结构体数据可作为函数参数(如,结构体变量作形参,结构体指针作函数参数等)。 . 函数的返回值类型可以是结构体(或指向结构体的指针)。,21,2. 应用示例,读程序,总结使用方法,给出执行结果。 注意如下的使用特征:

12、. 结构体数组(数组分量为结构体); . 指向结构体变量的指针; . 同类型的结构体变量间的相互赋值; . 结构体数据作为函数参数(结构体变量及结构体指针作为函数参数); . 函数的返回值类型为结构体。,22,#include #define MAXNUM 3 /自定义的结构体类型,注意该类型名为全局性的 struct StuType char name20; char sex; int age; double score; ;,23,void InputStuInfo(StuType* stu) /输入一个结构体的有关数据(各分量) /结构体指针作函数参数(实现“双向传递”) coutstu

13、-namestu-sexstu-agestu-score; ,24,void PrintStuInfo1(StuType stu) /输出一个结构体的有关数据(各分量) /方式一,结构体变量作形参(可“单向传入值”) coutnamesexagescoreendl; ,25,double aveScore(StuType Cla) /求结构体数组各分量之score域的平均值 /数组Cla作形参,其分量为结构体 double a=0.0; for(int i=0; iMAXNUM; i+) a+=Clai.score; return (a/MAXNUM); ,26,StuType MaxAgeS

14、tu(StuType* softCla) /求结构体数组中具有最大年龄的那一数组元素(为结构体) /函数的返回值类型是结构体 int maxAge=softCla0.age, ind=0; for(int i=1; imaxAge) maxAge=softClai.age; ind=i; return softClaind; ,27,void main() int i;double aveScr; StuType *pStu; StuType li, softClaMAXNUM, maxAgeStudent; cout- Input info of StuType li -endl; Inpu

15、tStuInfo(,28,cout- Input info of StuType softClaMAXNUM -endl; pStu = softCla; /pStu指向softCla数组的首元素 for (i=0; iMAXNUM; i+) InputStuInfo(pStu); /实参为指针,可将输入结果放入pStu所指向的数组元素中 pStu+; /使pStu指向softCla数组的下一个元素 ,29,cout- The info of softCla -endl; for (i=0; iMAXNUM; i+) PrintStuInfo1(softClai); /数组分量为结构体,作为实

16、参传递 aveScr = aveScore(softCla); /数组名softCla作实参(指针概念) cout- The aveScore in softCla -endl; coutaveScr=aveScrendl;,30,maxAgeStudent=MaxAgeStu(softCla); /求具有最大age的结构体;数组名softCla作实参(指针概念) /注意, 此处的赋值为同类型结构体变量间的相互赋值 cout- The info of maxAgeStudent -endl; PrintStuInfo1(maxAgeStudent); 程序执行后的显示结果如下: - Input

17、 info of StuType li - Input student_info - name, sex, age, score: lijie m 22 89 - The info of li - lijie m 22 89 lijie m 22 89,31,- Input info of StuType softCla3 - Input student_info - name, sex, age, score: maxin m 20 91 Input student_info - name, sex, age, score: jilin m 21 97 Input student_info

18、- name, sex, age, score: hanli f 20 89 - The info of softCla - maxin m 20 91 jilin m 21 97 hanli f 20 89 - The aveScore in softCla - aveScr=92.3333 - The info of maxAgeStudent - jilin m 21 97,32,6.10 建立一个人员档案链表 (通过改造书p156-159,6.5.2节内容而成),为了管理人员(职员,学生,居民等)或物资、文献的档案资料,使用链表形式很方便。链表可长可短,其功能可通过使用指针以及动态创建

19、和撤消数据对象的运算符new和delete来完成。 本示例性程序建立并管理人员链表,具体做以下4项工作: 1) 读入若干个人员的档案资料(读入*符号时结束输入),动态生成链表项,并将输入的档案资料存放于链表项之中,而后总将新链表项加入到原链表的末尾; 2) 遍历链表, 输出整个链表的各项内容; 3) 在链表首加入一项, 其name=wang ping, age=20, sex=M ; 4) 统计出当前链表中共有多少男士,并计算出他们的平均年龄。,33,程序执行后的显示结果如下: 1-name(ending if name=*):zhang yi -1-age,sex:22 m 2-name(e

20、nding if name=*):wang fan -2-age,sex:21 f 3-name(ending if name=*):li qiang -3-age,sex:22 m 4-name(ending if name=*):* zhang yi 22 m wang fang 21 f li qiang 22 m Male-num=3, average-age=21.3333,34,程序如下:,#include #include #include void main(void) int i; struct person char name12; int age; char sex;/M

21、/m-男, F/f-女 person* next; ; person* head, *tail, *temp; tail = head = NULL;,35,/ 1) 读入人员信息,依次存入/动态生成的各链表项中,for(i=1;i+) /第二式“空”,无限循环,靠break跳出 char name12; coutname,name); /给name域赋值 couttemp-agetemp-sex; /age及sex域值 temp-next=NULL; /新表项将充当链表末项,36,if(head=NULL) /链表空时,新项既为首项又为末项 head=tail=temp; else /链表非

22、空 tail-next=temp; /加入到末项之后 tail=temp;/新表项成为链表的新末项 else /输入结束符*时跳出循环 break; /i循环体结束,37,/ 2) 遍历链表,输出整个链表的各项内容 temp=head; while(temp!=NULL) coutnameage; coutsex; temp=temp-next; ,38,/ 3) 在链表首加入一项, /其name=wang ping, age=20, sex=M,temp=new person; /生成新表项 strcpy(temp-name,wang ping); /将欲加入的分量信息放入 temp-age

23、=20; temp-sex=M; temp-next=NULL; /新表项的next域(链表为空时必须!) if(head=NULL) /链表为空时 head=tail=temp; else /链表非空时,插入链首 temp-next=head; head=temp; /注意, 此2句的顺序不可颠倒! ,39,/ 4) 统计出共有多少男士,/ 并计算出他们的平均年龄,int num=0; /记录共有多少男士 double sumAge=0; /年龄之和 temp=head; while(temp!=NULL) /遍历链表,作统计与计算 if( temp-sex=M | temp-sex=m )

24、 /仅处理男士数据 num+; sumAge+=temp-age; temp=temp-next; coutendlMale-num=num, average-age=sumAge/numendl; ,40,6.11 指向函数的指针变量 - 参看书p147的6.2.5小节的3,按照如下的说明格式定义出的pf变量,为指向函数的指针变量。 说明格式:(*pf)(); 例: int (*pf)(); pf为指向函数的指针(即*pf为函数名),该函数无参,且返回值类型为int。 下述示例性程序通过使用指向函数的指针变量来调用自定义函数max及min。 程序执行后的显示结果如下: max?/min? -

25、 input 1/0 :1 For MAX: input 2 integer numbers = a, b :22 -3 max(a,b)=22,41,#include int max(int x, int y) /自定义的max函数 return (xy?x:y); int min(int x, int y) /自定义的min函数 return (xtmp;,42,if(tmp=1) /求max p = max; /类似数组名,函数名也为常量指针 /(表示函数的入口地址),赋给函数指针p cout a, b :; cinab; c=(*p)(a,b); /*p即max,以实参a、b对max进

26、行调用 cout a, b :; cinab; c=(*p)(a,b); /*p即min,以实参a、b对min进行调用 coutcendl; ,43,6.12 返回指针值的函数 - 参看书p147的6.2.5小节的2,说明格式:* ( ); 例: int * f(); /f为无参函数,其返回值类型 /为int*,即指针类型。 char * match(char c, char * str); /match为具有两个参数的函数, /其返回值类型为char*,即指针类型。,44,下述示例性程序使用了返回指针值的自定义函数,实现如下功能: 提示用户输入任意一个字符串,而后找到输入串中第一个a字符出现

27、的位置(若有的话),并输出从a字符开始的子串; 若输入串中不出现a字符的话, 输出 “No match found”。 程序执行后的显示结果如下: Input a string: I am a student. Sub_str from first a =am a student.,45,程序如下:,#include #include /use gets char * match(char c, char * str); /返回str中第一个c字符出现的位置(地址值,即指向字符的指针) void main() char s80, *p; coutpendl; else /s中不含有a字符 co

28、utNo match foundendl; ,46,char * match(char c, char * s) /找str中第一个c字符出现的位置并返回 int i=0; while( si!=c /没找到时返NULL ,47,注意区分:按照如下9种方式所定义 出的具有不同含义的a。,(1)int a; (2)int* a; (3)int* a; (4)int a10; (5)int* a10; (6)int (*a)10; (7)int a( ); (8)int* a( ); (9)int (*a)( );,48,6.13 带参数的main函数 - 参看书p39-p40的2.4.1小节的内

29、容,通常,我们大都按照“void main()”的格式来使用main函数。实际上,如果需要,main也可带有参数,按照如下方式进行说明: void main(int argc, char* argv) 注意, 参数的名字可以另起,但参数的类型与顺序不可更改。 main带有形式参数时,其对应实参值(通常称做命令行参数或程序参数)由用户在执行该程序前通过集成环境(或命令行)来指定,而后通过操作系统将它们传递给main函数。,49,1. main所含参数的使用含义,argc - 第一参数,记录命令行参数的个数(其值为实际命令行参数的个数加1); argv - 第二参数,为字符串数组(数组分量的类型为

30、char*),存放执行程序名以及各实际命令行参数。各数组元素的使用含义为: argv0: 本执行程序的文件名(包括路径); argv1: 第1个实际命令行参数(若有的话); . argvargc-1: 第argc-1个实际命令行参数(若有的话)。,50,在VC6.0集成开发环境下,运行程序前,可通过如下步骤来设置命令行参数(程序参数): Project = Settings. = Debug = “Program arguments:”框内,输入以空格分割的各参数,如,“11 para_2 f:mydirmyfile.txt”(该框空时,无命令行参数) = OK 下面给出的示例性程序,其mai

31、n函数中带有参数,执行程序后,将显示出所带来的具体实参值(假设源程序文件为“D:带参数的main函数.cpp”,则最终形成的可执行文件为“D:带参数的main函数Debug带参数的main函数.exe”)。,51,#include void main(int argc, char* argv) coutargv0: argv0endl; if(argc=1) coutNo other argements entered !endl; else coutYou entered other argc-1 arguments:n; for(int i=1; iargc; i+) coutargvi:

32、 argviendl; ,52,程序执行后的显示结果如下(设置了上述3个参数后的输出结果): argv0: D:带参数的main函数Debug带参数的main函数.exe You entered other 3 arguments: argv1: 11 argv2: para_2 argv3: d:mydirmyfile.txt 程序执行后的显示结果如下(不设参数时的输出结果): argv0: D:带参数的main函数Debug带参数的main函数.exe No other argements entered !,53,6.14 引用 - 参看书p150-p153的6.4节,6.14.1 引用

33、简介 简单的说,引用是某个变量或对象的别名。建立引用时,必须用某个变量名或对象名来对它进行初始化,从而将该引用绑定在那一个变量或对象上。 即是说,建立引用并不重新为其分配内存空间,引用只是另一变量或对象的别名,任何对引用的使用与改变都是对该引用所绑定的那一变量或对象的使用与改变。,54,1. 引用的建立,建立引用的格式如下: ”之后,b与refb的当前值都将是55,而a与refa都在原有值2的基础上增加了2,即当前值都变成了4。,55,2. 引用和指针的区别,引用和指针从说明到使用上都有些相似,但在概念上却有着明显的不同。主要区别在以下几个方面。 (1) 指针表示的是一个对象变量的地址,而引用则表示一个对象变量的别名。因此在程序中表示其对象变量时,前者要通过取内容运算符“*”,而后者可直接代表。例如: int a;int *pa=,56,(2) 指针是可变的,它可以指向变量a,也可以指向变量b,而引用则只能在建立时一次确定(固定绑定在某一个变量上),不可

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论