资源预览内容
第1页 / 共55页
第2页 / 共55页
第3页 / 共55页
第4页 / 共55页
第5页 / 共55页
第6页 / 共55页
第7页 / 共55页
第8页 / 共55页
第9页 / 共55页
第10页 / 共55页
亲,该文档总共55页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
Chap 11 指针进阶,11.1 布袋中的彩色球11.2 解密藏头诗11.3 学生信息管理的链表实现,本章要点,指针数组和指向指针的指针是如何被定义和使用的?指针如何作为函数的返回值?指向函数的指针的意义是什么?什么是结构的递归定义,哪种应用需要这种定义方法?对链表这种数据结构,如何进行动态内存分配操作?如何建立单向链表并实现插入、删除以及查找操作?,11.1 布袋中的彩色球,11.1.1 程序解析11.1.2 指针数组的概念11.1.3 指向指针的指针11.1.4 用指针数组处理多个字符串11.1.5 命令行参数,11.1.1 程序解析,例11-1 已知一个不透明的布袋里装有红、蓝、黄、绿、紫同样大小的圆球各一个,现从中一次抓出两个,问可能抓到的是什么颜色的球?,程序解析例11-1 源程序,#includeint main(void) char *color5 = red, blue, yellow, green, purple; /* 初始化 */ int count = 0, i, j; for(i = 0; i = 4; i+) /* i代表第一个球对应的颜色下标 */ for(j = 0; j = 4; j+) /* 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 purple,指针数组,11.1.2 指针数组的概念,char *color5;类型名 *数组名数组长度数组元素是指针类型,用于存放内存地址int a10;a是一个数组,它有10个元素每个元素的类型都是整型char *color5;color是一个数组,它有5个元素每个元素的类型都是字符指针,char *color5 = red, blue, yellow, green, purple;color是一个数组,它有5个元素每个元素的类型都是字符指针数组元素可以处理字符串对指针数组元素的操作相当于对同类型指针变量的操作printf(%10s %10sn, colori, colorj);,指针数组的概念,#include int main(void) int i; char *color5 = red, blue, yellow, green, purple, *tmp; for(i = 0; i 5; i+) /* 输出字符串的地址和内容*/ printf(%x, %sn, colori, colori); tmp = color0; /* 交换color0与color4*/ color0 = color4; color4 = tmp; printf(color0:%s, color4:%sn, color0, color4); return 0;,420064, red42005c, blue420054, yellow42004c, green420044, purplecolor0:purple, color4:red,例11-2 使用指针数组输出5种颜色的英文名称,交换color0与color4的值,例11-2 图示,11.1.3 指向指针的指针示例,例11-3 改写例11-1,用指向指针的指针实现。 #includeint main(void) char *color5 = red, 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),指向指针的指针示例分析,char *color5 = red, blue, yellow, green, purple;char *pc = color;printf( %10s %10sn, *(pc + i), *(pc + j) );,pc: color 或者&color0*pc: color0: red*(pc+i) : colori*color0: r *pc: *color0: r,指向指针的指针定义,指向指针的指针(二级指针) 类型名 *变量名int a = 10;int *p = &a;int *pp = &p;,int 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;,11.1.4 用指针数组处理多个字符串,处理多个字符串二维字符数组char ccolor 7 = red, blue, yellow, green, purple;指针数组char *pcolor = red, blue, yellow, green, purple;,使用指针数组更节省内存空间,1. 用指针数组处理多个字符串排序,例11-5 将5个字符串从小到大排序后输出。,#include int main(void) int i; int a5 = 6, 5, 2, 8, 1; void fsort( 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;,例11-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; ,pcolor0,pcolor1,pcolor2,pcolor3,pcolor,pcolor4,排序前,pcolor0,pcolor1,pcolor2,pcolor3,pcolor,pcolor4,排序后,2. 动态输入多个字符串示例,用动态分配内存的方法处理多个字符串的输入示例例11-6 输入一些球的颜色,以#作为输入结束标志,再输出这些颜色。其中颜色数小于20,颜色的英文名称不超过10个字符。,#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+; scanf(%s, str); printf(你输入的颜色是:); for(i = 0; i n; i+) printf(%s , colori); return 0;,请输入颜色名称,每行一个,#结束输入:redblue yellow#你输入的颜色是:red blue yellow,3. 对指针数组的进一步讨论,
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号