chap11-指针进阶

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

Chap11指针进阶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】已知奥运五环的5种颜色的英文单词按一定顺序排列,输入任意一个颜色的英文单词,从已有颜色中查找并输出该颜色的位置值,若没有找到,则输出“NotFound”。11.1.1程序解析#includestdio.h#includestring.hintmain(void){inti;char*color[5]={“red”,”blue”,”yellow”,”green”,”black”};charstr[20];printf(“Inputacolor:”);scanf(“%s”,str);for(i=0;i5;i++)if(strcmp(str,color[i])==0)/*比较颜色是否相同*/break;if(i5)printf(“position:%d\n”,i+1);elseprintf(“NotFound\n”);return0;}运行结果1Inputacolor:yellowposition:3运行结果2Inputacolor:purpleNotFound指针数组11.1.2指针数组的概念C语言中的数组可以是任何类型,如果数组的各个元素都是指针类型,用于存放内存地址,那么这个数组就是指针数组。一维指针数组定义的一般格式为:类型名*数组名[数组长度]11.1.2指针数组的概念inta[10];a是一个数组,它有10个元素每个元素的类型都是整型char*color[5];color是一个数组,它有5个元素每个元素的类型都是字符指针11.1.2指针数组的概念char*color[5]={red,blue,yellow,green,black};color是一个数组,它有5个元素每个元素的类型都是字符指针数组元素可以处理字符串对指针数组元素的操作:printf(%s%x\n,color[i],color[i]);colorcolor[0]red\0blue\0color[1]color[2]color[3]color[4]yellow\0green\0black\0对指针数组元素的操作和对同类型指针变量的操作相同继续执行:char*tmp;tmp=color[0];color[0]=color[4];color[4]=tmp;11.1.2指针数组的概念colorcolor[0]red\0blue\0color[1]color[2]color[3]color[4]yellow\0green\0black\0color[0]与color[4]交换后的情况指针数组操作时:•可以直接对数组元素进行赋值(地址值)和引用tmp=color[0];•也可以间接访问和操作数组元素所指向的单元内容strcpy(color[0],“purple);11.1.3指向指针的指针C语言中,指向指针的指针(二级指针)一般定义为:类型名**变量名inta=10;int*p=&a;int**pp=&p;&apa10&ppp*p*pp**pp&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*painta=10,b=20,t;int*pa=&a,*pb=&b,*pt;int**ppa=&pa,**ppb=&pb,**ppt;【例11-2】操作(1):ppt=ppb;ppb=ppa;ppa=ppt;操作(2):pt=pb;pb=pa;pa=pt;操作(3):t=b;b=a;a=t;二维数组的指针形式a[3][4]:看成是由a[0]、a[1]、a[2]组成的一维数组,而a[0]、a[1]、a[2]各自又是一个一维数组。也即二维数组是数组元素为一维数组的一维数组。a:第0行地址(行地址)a+i:第i行的地址*(a+i)/a[i]:第i行首元素的地址*(a+i)+j/a[i]+j:第i行第j个元素的地址**(a+i)/a[i][0]:第i行首元素的值*(*(a+i)+j)/a[i][j]:第i行第j个元素的值11.1.3指向指针的指针二维数组的行指针int(*p)[3];p=a;//用行地址初始化逐行查找-〉逐列查找pshorta[2][3];a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]aa+1指针和二维数组间的关系二维数组的行指针int(*p)[3];p=a;//用行地址初始化逐行查找→逐列查找pshorta[2][3];a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]a+1a指针和二维数组间的关系二维数组的行指针int(*p)[3];p=a;//用行地址初始化逐行查找-〉逐列查找for(i=0;im;i++)for(j=0;jn;j++)printf(%d,*(*(p+i)+j));shorta[2][3];a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]paa+1指针和二维数组间的关系二维数组的列指针int*p;p=*a;//用列地址初始化逐个查找——相对偏移量for(i=0;im;i++)for(j=0;jn;j++)printf(%d,*(p+i*n+j));pshorta[2][3];a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]*a或a[0]p[i*n+j]指针和二维数组间的关系【例】输入一个3行4列的二维数组,然后输出这个二维数组的元素值指针和二维数组间的关系【例】输入一个3行4列的二维数组,然后输出这个二维数组的元素值指针和二维数组间的关系形参声明为列数已知的二维数组【例】输入一个3行4列的二维数组,然后输出这个二维数组的元素值指针和二维数组间的关系形参声明为指向列数已知的二维数组的行指针【例11-3】改写例11-1,用指向指针的指针实现。#includestdio.h#includestring.hintmain(void){inti;char*color[5]={“red”,”blue”,”yellow”,”green”,”black”};/char**pc;/*定义二级指针变量*/charstr[20];pc=color;/*二级指针赋值*/printf(“Inputacolor:”);scanf(“%s”,str);for(i=0;i5;i++)if(strcmp(str,*(pc+i))==0)/*比较颜色是否相同*/break;if(i5)printf(“position:%d\n”,i+1);elseprintf(“NotFound\n”);return0;}11.1.3指向指针的指针指向指针的指针使用指向指针的指针操作数据11.1.3指向指针的指针【例11-3】改写例11-1,用指向指针的指针实现。pccolor&color[0]*pccolor[0]*(pc+i)color[i]**pc*(*pc)*color[0]:‘r’colorcolor[0]red\0blue\0color[1]color[2]color[3]color[4]yellow\0green\0black\0pc*pc1.指针数组与二维数组二维字符数组charccolor[][7]={red,blue,yellow,green,“black};11.1.4用指针数组处理多个字符串使用指针数组更节省内存空间pcolorred\0blue\0yellow\0green\0black\0red\0blue\0yellow\0green\0black\0ccolor指针数组char*pcolor[]={red,blue,yellow,green,“black};11.1.4用指针数组处理多个字符串2.用指针数组操作多个字符串【例11-4】将5个字符串从小到大排序后输出。voidmain(){inti;inta[5]={6,5,2,8,1};voidfsort(inta[],intn);fsort(a,5);for(i=0;i5;i++)printf(%d,a[i]);}#includestring.hvoidmain(){inti;char*pcolor[]={“red”,”blue”,”yellow”,”green”,”black”};voidfsort(char*color[],intn);fsort(pcolor,5);for(i=0;i5;i++)printf(%s,pcolor[i]);}11.1.4用指针数组处理多个字符串voidfsort(inta[],intn){intk,j;inttemp;for(k=1;kn;k++)for(j=0;jn-k;j++)if(a[j]a[j+1]){temp=a[j];a[j]=a[j+1];a[j+1]=temp;}}voidfsort(char*color[],intn){intk,j;char*temp;for(k=1;kn;k++)for(j=0;jn-k;j++)if(strcmp(color[j],color[j+1])0){temp=color[j];color[j]=color[j+1];color[j+1]=temp;}}排序前排序后11.1.4用指针数组处理多个字符串例11-5解密藏头诗。所谓藏头诗,就是将一首诗每一句的第一个字连起来,所组成的内容就是该诗的真正含义。编写程序,输出一首藏头诗的真实含义。一叶轻舟向东流,帆梢轻握杨柳手,风纤碧波微起舞,顺水任从雅客悠。11.1.4用指针数组处理多个字符串#includestdio.hchar*change(chars[][20]);intmain(void){inti;char*poem[4]={一叶轻舟向东流,,帆梢轻握杨柳手,,风纤碧波微起舞,,顺水任从雅客悠。};/*指针数组初始化*/charmean[10];for(i=0;i4;i++){/*每行取第1个汉字存入mean*/mean[2*i]=*(poem[i]);mean[2*i+1]=*(poem[i]+1);}mean[2*i]=’\0’;printf(%s\n,mean);/*输出结果*/return0;}11.1.4用指针数组处理多个字符串11.1.4用指针数组处理多个字符串3.动态输入多个字符串例11-6输入一些有关颜色的单词,每行一个,以#作为输入结束标志,再按输入的相反次序输出这些单词。其中单词数小于20,每个单词不超过15个字母(用动态分配内存的方法处理多个字符串的输入)。#includestdio.h#includestdlib.h#includestring.hintmain(void){inti,n=0;char*color[20],str[15];scanf(%s,str);while(str[0]!='#'){color[n]=(char*)malloc(sizeof(char)*(strlen(str)+1));/*动态分配*/strcpy(color[n],str

1 / 64
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功