《C语言指针进阶》PPT课件.ppt

上传人:m**** 文档编号:572064828 上传时间:2024-08-12 格式:PPT 页数:40 大小:367.52KB
返回 下载 相关 举报
《C语言指针进阶》PPT课件.ppt_第1页
第1页 / 共40页
《C语言指针进阶》PPT课件.ppt_第2页
第2页 / 共40页
《C语言指针进阶》PPT课件.ppt_第3页
第3页 / 共40页
《C语言指针进阶》PPT课件.ppt_第4页
第4页 / 共40页
《C语言指针进阶》PPT课件.ppt_第5页
第5页 / 共40页
点击查看更多>>
资源描述

《《C语言指针进阶》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《C语言指针进阶》PPT课件.ppt(40页珍藏版)》请在金锄头文库上搜索。

1、第第11章章 指针进阶指针进阶C语言程序设计第第11章章 指针进阶指针进阶8/12/20241第第11章章 指针进阶指针进阶C语言程序设计本章要点本章要点指针数组和指向指针的指针是如何被定义和使用的指针数组和指向指针的指针是如何被定义和使用的?指针如何作为函数的返回值?指针如何作为函数的返回值?指向函数的指针的意义是什么?指向函数的指针的意义是什么?什么是结构的递归定义,哪种应用需要这种定义方什么是结构的递归定义,哪种应用需要这种定义方法?法?对链表这种数据结构,如何进行动态内存分配操作对链表这种数据结构,如何进行动态内存分配操作?如何建立单向链表并实现插入、删除以及查找操作如何建立单向链表并

2、实现插入、删除以及查找操作? 8/12/20242第第11章章 指针进阶指针进阶C语言程序设计11.1 布袋中的彩色球布袋中的彩色球例例1 已知一个不透明的布袋里装有红、蓝、黄、已知一个不透明的布袋里装有红、蓝、黄、绿、紫同样大小的圆球各一个,现从中一绿、紫同样大小的圆球各一个,现从中一次抓出两个,问可能抓到的是什么颜色的次抓出两个,问可能抓到的是什么颜色的球?球?8/12/20243第第11章章 指针进阶指针进阶C语言程序设计程序解析程序解析#includeint main(void) char *color5 = red, blue, yellow, green, purple; /* 初

3、始化初始化 */ int count = 0, i, j; for(i = 0; i = 4; i+) for(j = 0; j = 4; j+) if(i = j) continue; count +; printf(%6d, count); printf(%10s %10sn, colori, colorj); return 0; 1 red blue 2 red yellow 3 red green 4 red purple 5 blue yellow 6 blue green 7 blue purple 8 yellow green 9 yellow purple 10 green p

4、urple指针数组指针数组8/12/20244第第11章章 指针进阶指针进阶C语言程序设计2. 指针数组的概念指针数组的概念char *color5;类型名类型名 *数组名数组名数组长度数组长度int a10;a是一个数组,它有是一个数组,它有10个元素个元素每个元素的类型都是整型每个元素的类型都是整型char *color5;color是一个数组,它有是一个数组,它有5个元素个元素每个元素的类型都是每个元素的类型都是字符字符指针指针8/12/20245第第11章章 指针进阶指针进阶C语言程序设计char *color5 = red, blue, yellow, green, purple;c

5、olor是一个数组,它有是一个数组,它有5个元素个元素每个元素的类型都是每个元素的类型都是字符字符指针指针数组元素可以处理字符串数组元素可以处理字符串对指针数组元素的操作对指针数组元素的操作相当于相当于对同类型指针变量的操作对同类型指针变量的操作printf(%10s %10sn, colori, colorj);8/12/20246第第11章章 指针进阶指针进阶C语言程序设计#include int main(void) int i; char *color5 = red, blue, yellow, green, purple, *tmp; /* 输出字符串的地址和内容输出字符串的地址和内

6、容*/(思考思考) for(i = 0; i 5; i+) printf(%x, %sn, colori, colori); return 0;420064, red42005c, blue420054, yellow42004c, green420044, purplecolor0:purple, color4:red例例2 使用指针数组输出使用指针数组输出5种颜色的英文名称种颜色的英文名称8/12/20247第第11章章 指针进阶指针进阶C语言程序设计交换交换color0与与color4的值的值 8/12/20248第第11章章 指针进阶指针进阶C语言程序设计3.指向指针的指针指向指针的指

7、针(1)定义)定义指向指针的指针(指向指针的指针(二级指针二级指针) 类型名类型名 *变量名变量名int a = 10;int *p = &a;int *pp = &p; &apa10&ppp*p*pp*pp8/12/20249第第11章章 指针进阶指针进阶C语言程序设计&apaa10&pappa*ppa*pa&bpbb20&pbppb*ppb*pbpaappa&a10&pb*ppb*pa&bpbb20&pappb*ppa*pbpaappa&b10&pb*ppa*pb&apbb20&pappb*ppb*papaappa&b20&pb*ppa*pb&apbb10&pappb*ppb*paint

8、a = 10, b = 20, t;int *pa = &a, *pb = &b, *pt;int *ppa = &pa, *ppb = &pb, *ppt;例11-4操作操作(1):ppt = ppb; ppb = ppa; ppa = ppt; 操作操作(2):pt = pb; pb = pa; pa = pt; 操作操作(3):t = b; b = a; a = t; 8/12/202410第第11章章 指针进阶指针进阶C语言程序设计例例3 改写例改写例1,用指向指针的指针实现。,用指向指针的指针实现。 #includeint main(void) char *color5 = red,

9、 blue, yellow, green, purple; char *pc = color; int count = 0, i, j; for(i = 0; i = 4; i+) for(j = 0; j = 4; j+) if(i = j) continue; count+; printf( %6d, count ); printf( %10s %10sn, colori, colorj ); return 0;指向指针的指针指向指针的指针*(pc + i), *(pc + j)8/12/202411第第11章章 指针进阶指针进阶C语言程序设计4. 用指针数组处理多个字符串用指针数组处理多

10、个字符串处理多个字符串处理多个字符串二维字符数组二维字符数组char ccolor 7 = red, blue, yellow, green, purple;指针数组指针数组char *pcolor = red, blue, yellow, green, purple;使用指针数组更节省内存空间使用指针数组更节省内存空间8/12/202412第第11章章 指针进阶指针进阶C语言程序设计1. 用指针数组处理多个字符串排序例11-5 将5个字符串从小到大排序后输出。#include int main(void) int i; int a5 = 6, 5, 2, 8, 1; void fsort(

11、int a , int n ); fsort( a, 5 ); for(i = 0; i 5; i+) printf(%d , ai); return 0; #include int main(void) int i; char *pcolor5= red, blue, yellow, green, purple ; void fsort(char *color , int n); fsort( pcolor, 5 ); for(i = 0; i 5; i+) printf(%s , pcolori); return 0; 8/12/202413第第11章章 指针进阶指针进阶C语言程序设计例1

12、1-5 字符串排序void fsort(int a , int n) int k, j; int temp; for(k = 1; k n; k+) for(j = 0; j aj+1) temp = aj; aj = aj+1; aj+1 = temp; void fsort(char *color , int n) int k, j; char *temp; for(k = 1; k n; k+) for(j = 0; j 0) temp = colorj; colorj = colorj+1; colorj+1 = temp; 8/12/202414第第11章章 指针进阶指针进阶C语言程

13、序设计pcolor0pcolor1pcolor2pcolor3pcolorred0blue0yellow0green0purple0pcolor4排序前排序前pcolor0pcolor1pcolor2pcolor3pcolorpcolor4排序后排序后red0blue0yellow0green0purple08/12/202415第第11章章 指针进阶指针进阶C语言程序设计2. 动态输入多个字符串动态输入多个字符串例例6 输入一些球的颜色,以输入一些球的颜色,以#作为输入结束标志,再输作为输入结束标志,再输出这些颜色。出这些颜色。其中颜色数小于其中颜色数小于20,颜色的英文名称不超过,颜色的英

14、文名称不超过10个字符。个字符。8/12/202416第第11章章 指针进阶指针进阶C语言程序设计#include #include#includeint main(void) int i, n = 0; char *color20, str10; printf(请输入颜色名称,每行一个,请输入颜色名称,每行一个,#结束输入:结束输入:n); scanf(%s, str); while(str0 != #) colorn = (char *) malloc ( sizeof (char) * ( strlen(str) + 1 ) ); strcpy(colorn, str); n+; sca

15、nf(%s, str); printf(你输入的颜色是:你输入的颜色是:); for(i = 0; i n; i+) printf(%s , colori); return 0;请输入颜色名称,每行一个,请输入颜色名称,每行一个,#结束输入:结束输入:redblue yellow#你输入的颜色是:你输入的颜色是:red blue yellow8/12/202417第第11章章 指针进阶指针进阶C语言程序设计3. 对指针数组的进一步讨论对指针数组的进一步讨论char *color = red, blue, yellow, green, purple;color:二级指针:二级指针(char *)

16、,&color0 color+2:指向:指向color2 *(color+2)和和color2等价等价 color0:指向字符串:指向字符串red的首字符的首字符rcolor0+2:指向首字符:指向首字符r后的第后的第2个字符个字符d8/12/202418第第11章章 指针进阶指针进阶C语言程序设计colork*(color+k) printf(%s, color2); printf(%s, *(color+2); 8/12/202419第第11章章 指针进阶指针进阶C语言程序设计*11.1.5 命令行参数8/12/202420第第11章章 指针进阶指针进阶C语言程序设计11.2 解密藏头诗

17、11.2.1 程序解析11.2.2 指针作为函数的返回值11.2.3 指向函数的指针8/12/202421第第11章章 指针进阶指针进阶C语言程序设计11.2 解密藏头诗解密藏头诗例例8 输输入入一一首首藏藏头头诗诗(假假设设只只有有4句句),输输出出其其真真实实含含义。义。藏藏头头诗诗:将将这这首首诗诗每每一一句句的的第第一一个个字字连连起起来来,所所组组成的内容就是该诗的真正含义。成的内容就是该诗的真正含义。请输入藏头诗:请输入藏头诗:一叶轻舟向东流,一叶轻舟向东流,帆梢轻握杨柳手,帆梢轻握杨柳手,风纤碧波微起舞,风纤碧波微起舞,顺水任从雅客悠。顺水任从雅客悠。一帆风顺一帆风顺8/12/2

18、02422第第11章章 指针进阶指针进阶C语言程序设计#include char *change(char s 20, char t );int main(void) int i; char s420, t10, *p; printf(“请输入藏头诗:请输入藏头诗:n”); for(i = 0; i 4; i+) scanf(%s, si); p = change(s, t); printf(%sn, p); return 0;char * change(char s 20, char t ) int i; for(i= 0; i 4; i+) t2*i = si0; t2*i+1 = si1

19、; t2*i = 0; return t;8/12/202423第第11章章 指针进阶指针进阶C语言程序设计例例9 输入一个字符串和一个字符,如果该字符在字符输入一个字符串和一个字符,如果该字符在字符串中,就从该字符首次出现的位置开始输出字符串中串中,就从该字符首次出现的位置开始输出字符串中的字符。的字符。要求定义函数要求定义函数match(s, ch),在字符串,在字符串s中查找字符中查找字符ch,如果找到,返回第一次找到的该字符在字符串中的,如果找到,返回第一次找到的该字符在字符串中的位置(地址);否则,返回空指针位置(地址);否则,返回空指针NULL。 例如,输入字符例如,输入字符r和字

20、符串和字符串program后,输出后,输出rogram。8/12/202424第第11章章 指针进阶指针进阶C语言程序设计#include char *match(char *s, char ch) while(*s != 0) if(*s = ch) return(s); /* 若找到字符若找到字符ch,返回相应的地址,返回相应的地址 */ else s+; return(NULL); /* 没有找到没有找到ch,返回空指针,返回空指针 */int main(void ) char ch, str80, *p = NULL; printf(“Please Input the string:n

21、”); scanf(%s, str); getchar( ); ch = getchar( ); if( ( p = match(str, ch) ) != NULL ) printf(%sn, p); else printf(Not Foundn); return 0;Please Input the string:University vversity字符指针字符指针p接收接收match返回的返回的地址,从地址,从p指向的存储单元开指向的存储单元开始,连续输出其中的内容,直始,连续输出其中的内容,直至至0为止。为止。 Please Input the string:school aNot

22、Found8/12/202425第第11章章 指针进阶指针进阶C语言程序设计*11.2.3 指向函数的指针每个函数都占用一段内存单元,有一个入口地址(起始地址)函数名:函数的入口地址函数指针:一个指针变量,接收函数的入口地址,让它指向函数通过函数指针调用函数做为函数的参数 指令指令1指令指令2指令指令3指令指令n入口地址入口地址8/12/202426第第11章章 指针进阶指针进阶C语言程序设计例11 建立一个学生成绩信息(包括学号、姓名、成绩)的单向链表,学生记录按学号由小到大顺序排列,要求实现对成绩信息的插入、修改、删除和遍历操作。mainInsertDocDeleteDocPrint_St

23、u_Doc Create_Stu_DocInsertDochead9905 Qian 80 NULL9901 Wang 809902 Li 9011.3 学生信息管理的链表实现学生信息管理的链表实现 8/12/202427第第11章章 指针进阶指针进阶C语言程序设计1 链表的概念链表的概念一种一种动态存储动态存储分布的数据结构分布的数据结构若干个同一结构类型的若干个同一结构类型的“结点结点”依次串接而成依次串接而成单向链表单向链表、双向链表、双向链表 头指针头指针结点结点尾结点尾结点8/12/202428第第11章章 指针进阶指针进阶C语言程序设计结点定义结点定义struct stud_nod

24、e int num; char name20; int score; struct stud_node *next; 结构的递归定义结构的递归定义head9905 Qian 80 NULL9901 Wang 809902 Li 908/12/202429第第11章章 指针进阶指针进阶C语言程序设计链表与数组比较链表与数组比较数组数组事先定义固定长度的数组事先定义固定长度的数组在数组元素个数不确定时,可能会发生浪费内存在数组元素个数不确定时,可能会发生浪费内存空间的情况空间的情况 链表链表动态存储分配的数据结构动态存储分配的数据结构根据需要动态开辟内存空间,比较方便地插入新根据需要动态开辟内存空

25、间,比较方便地插入新元素(结点)元素(结点)使用链表可以使用链表可以节省内存节省内存,提高操作效率,提高操作效率 8/12/202430第第11章章 指针进阶指针进阶C语言程序设计动态存储分配函数动态存储分配函数malloc()void *malloc(unsigned size) 在内存的动态存储区中分配一连续空间,其长度为在内存的动态存储区中分配一连续空间,其长度为size若申请成功,则返回一个指向所分配内存空间的起若申请成功,则返回一个指向所分配内存空间的起始地址的指针始地址的指针若申请不成功,则返回若申请不成功,则返回NULL(值为值为0)8/12/202431第第11章章 指针进阶指

26、针进阶C语言程序设计malloc()示例示例int *ip = (int *) malloc( sizeof(int) )struct student * p;p = (struct student *) malloc(sizeof(struct student);调用调用malloc时,用时,用 sizeof 计算存储块大小计算存储块大小虽然存储块是动态分配的,但它的大小在分配后也是确虽然存储块是动态分配的,但它的大小在分配后也是确定的,不要越界使用。定的,不要越界使用。 p8/12/202432第第11章章 指针进阶指针进阶C语言程序设计动态存储释放函数free 当某个动态分配的存储块不再

27、用时,要及时将它释放void free(void *ptr) 释放由动态存储分配函数申请到的整块内存空间,ptr为指向要释放空间的首地址。free(ip);free(p); p8/12/202433第第11章章 指针进阶指针进阶C语言程序设计3 单向链表的常用操作单向链表的常用操作 链表的建立链表的建立 链表的遍历链表的遍历 插入结点插入结点 删除结点删除结点8/12/202434第第11章章 指针进阶指针进阶C语言程序设计1.链表的建立链表的建立struct stud_node *head, *tail, *p;head = tail = NULL;size = sizeof(struct

28、stud_node);p = (struct stud_node *) malloc(size);8/12/202435第第11章章 指针进阶指针进阶C语言程序设计 head = tail = NULL; scanf(%d%s%d, &num,name, &score); while(num != 0) p = (struct stud_node *) malloc(size); p-num = num; strcpy(p-name, name); p-score = score; p-next = NULL; if(head = NULL) head = p; else tail-next

29、= p; tail = p; scanf(%d%s%d, &num, name, &score); 8/12/202436第第11章章 指针进阶指针进阶C语言程序设计ptrptrfor(ptr = head; ptr != NULL; ptr = ptr - next) printf(%ld, %d, ptr - num, ptr - score);head9905 Qian 80 NULL9901 Wang 809902 Li 908/12/202437第第11章章 指针进阶指针进阶C语言程序设计s-next = ptr-nextptr-next = s先连后断headptrs3. 插入结点8/12/202438第第11章章 指针进阶指针进阶C语言程序设计ptr2=ptr1-nextptr1-next=ptr2-nextheadptr1ptr2free(ptr2)先接后删4. 删除结点ptr2headptr18/12/202439第第11章章 指针进阶指针进阶C语言程序设计习题习题11 1、3题题 8/12/202440

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

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