C语言程序设计-丁亚涛-40404-00第8章 指针_第1页
C语言程序设计-丁亚涛-40404-00第8章 指针_第2页
C语言程序设计-丁亚涛-40404-00第8章 指针_第3页
C语言程序设计-丁亚涛-40404-00第8章 指针_第4页
C语言程序设计-丁亚涛-40404-00第8章 指针_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

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

文档简介

第8章指针,理解并掌握地址、指针和指针变量的概念练掌握指针变量的定义、初始化和引用方法理解并掌握指针与数组的关系了解指针数组和多级指针的概念了解指针与函数的关系学会在程序设计中正确应用指针解决实际问题,学习目标,引言,指针是C语言区别于其他程序设计语言的主要特征之一。正确灵活地使用指针可以充分地发挥C语言的特点,提高某些程序的执行效率,更加方便地表示和访问复杂的数据结构、直接对内存操作等。,8.1借钱的故事,如果有位远方的朋友向你借10000元钱,请你选择下面两种方式之一:从信用卡(x,如:6222001302101234567)转给他10000元;用你的信用卡(x)办理的网上银行账号(p,如:3401032012030333333)转给他10000元。两种方式都可以。x和p都是存取银行存款的方式。通过x直接可存取,由于p中存储的是x的信息。访问p可以获取x的信息,再对银行存款进行操作。,8.1借钱的故事,8.2指针的概念,C语言允许使用变量名、数组名下标、函数名等标识符来访问内存指针其实就是在内存中的地址,它可能是变量的地址,也可能是函数的入口地址变量指针存储的地址是变量的地址函数指针存储的地址是函数的入口地址指针变量也简称为指针,是指它是一个变量,且该变量是指针类型的,8.3指针变量的定义和初始化,定义指针变量的形式如下:数据类型*指针变量名;定义并初始化的形式为:数据类型*指针变量名=没有指向的指针变量的值是随机的,称为“野指针”。,指针变量与变量的关系,inta,*pa=,8.4指针运算,8.4.1*运算符和取地址运算符*(temp=x;x=y;y=temp;voidswap2(int*x,int*y)inttemp;temp=*x;*x=*y;*y=temp;voidswap3(int*x,int*y)int*temp;temp=x;x=y;y=temp;voidmain()inta,b;int*pa,*pb;pa=,【例8-1】演示指针变量的引用,swap1(intx,inty),主函数调用方式为:swap1(a,b);值传递,a、b的值以及pa、pb指针变量都不受影响。swap2(int*x,int*y),主函数调用方式为:swap2(pa,pb);形参是指针变量,实参也是指针变量。交换算法中采用指向运算符*,所以*x、*y和pa、pb是对应相同的数据a、b,最后函数实现了交换。swap3(int*x,int*y),主函数调用方式为:swap3(pa,pb);形参是指针变量,实参也是指针变量。交换算法中临时指针变量虽然把x、y交换,但pa、pb没有交换,所以对应的数据a、b也没有受到影响,交换是失败的。,【例8-1】演示指针变量的引用,swap3()分析图,8.4.3指针的算术运算和关系运算,算术运算指针变量的+和-运算。指针加、减整数运算。指向同一数组不同元素的指针相减运算。假定有:charstr100=HelloWorld;char*p=str,*q;,8.4.3指针的算术运算和关系运算,p+,q=p+3;,字符W可以用str6表示,也可以用p5、q2表示,8.4.3指针的算术运算和关系运算,关系运算关系运算是比较指针大小的运算。两个指针相等说明指向同一存储单元。p=str)printf(%c,*p);/*逆序输出*/printf(n);p=str;q=des;while(*p!=NULL)*q+=*p+;/*字符串拷贝*/*q=NULL;printf(%sn,des);return0;,8.5.2指针与其他类型数组,【例8-3】演示指针和整型数组的关系,数组动态分配内存。#includevoidmain()inta10=1,2,3,4,5,6,7,8,9,10;int*p=a,*q=p+9;ints;for(s=0;q=p;q-)s=s+*q;printf(s=%dn,s);,8.5.3指针与二维数组,二维数组其实可以看成由一维数组构造而成。就相当于几个队列构成一个方阵,方阵由队列组成,队列由具体的元素-人组成。一级指针只能管理队列,如果管理方阵,则需要二级指针。inta=1000,*pa,*ppa;pa=*(*(ppa)*(pa)a1000,8.5.3指针与二维数组,二级指针演示图,【例8-4】演示指针和二维数组的关系,main()ints,t;inta34;int*p3,*q;inti,j;s=t=0;for(i=0;i3;i+)pi=ai;for(j=0;j4;j+)aij=i*3+j;for(i=0;i3;i+)q=pi;for(j=0;j4;j+)s=s+*(*(p+i)+j);t=t+*(q+j);printf(s=%d,t=%dn,s,t);,【分析】,int*p3是指针数组。所谓指针数组,首先是一个数组,只不过其元素不是普通的变量,而是指针变量。即p0、p1、p2相当于前面提到的指针变量。单独的指针变量可以指向一个一维数组,例如例题中的数组a的第一行,【分析】,p是指针数组的数组名,a12用p表示就是*(*(p+1)+2),其实就是*(p1+2)、*(a1+2),【分析】,【总结】,p是二级指针*p相当于*(p+0),级别降低为一级指针,相当于p0*p相当于*(*(p+0)+0),级别降低为数组元素(普通变量),也相当于p00p12,相当于*(*(p+1)+2)temp=*x;*x=*y;*y=temp;return0;实际调用该函数时,如:swap2(调用时,把实参的指针传送给形参,即传送Copy=/*间接调用*/,【例8-5】演示函数指针,#include#includeintsum(intn)inti,s=0;for(i=1;i=n;i+)s=s+i;returns;main()double(*s)(double)=。,【例8-6】演示函数指针2,#include#includeintf1(inta,intb)returna+b;intf2(inta,intb)returna-b;intf3(inta,intb)returna*b;intf4(inta,intb)if(b!=0)returna/b;elseprintf(errorn);return0;,【例8-6】演示函数指针2。,intf5(inta,intb)if(b!=0)returna%b;elseprintf(errorn);return0;intf6(intn)inti,s=0;for(i=1;i=n;i+)s=s+i;returns;intf7(intn)inti,s=1;for(i=1;i=n;i+)s=s*i;returns;,【例8-6】演示函数指针2,intf8(inta,intb,intc)returna+b+c;voidmain()int(*f)();inta,b,c;a=53;b=44;c=35;f=f1;printf(a+b=%dn,f(a,b);f=f2;printf(a-b=%dn,f(a,b);f=f3;printf(a*b=%dn,f(a,b);f=f4;printf(a/b=%dn,f(a,b);f=f5;printf(a%b=%dn,f(a,b);f=f6;printf(1+2+3+.+100=%dn,f(100);f=f7;printf(1*2*3*.*8=%dn,f(8);f=f8;printf(a+b+c=%dn,f(a,b,c);,8.6.3返回指针的函数,函数的返回值可以是一个指针。需要返回指针的函数,其类型必须也是指针类型。例如:char*copy(char*s,char*t)returns;函数名copy和其返回值s的类型都是char*。注意copy是函数名,是一个指针常量,如果定义成:char(*copy)();加上括号的copy是指针变量。定义成指针变量的形式没有函数体部分,变量是简单的实体,不能再包括其他代码。,【例8-7】设计一个类似于strcpy的函数,#includechar*copy(char*s,char*t)char*p=s,*q=t;while(*p!=0)p+;while(*q!=0)p+=q+;*p=0;returns;main()chars100=Hello;chart=World!;printf(%sn,copy(s,t);,8.7案例:字符的查找,intatc(char*string,charc)intpos=0;while(*string!=c,8-8统计字符的个数,【例8-9】用指针方法统计字符串Ilovemusicmorethangames中单词的个数。规定单词由字母组成,单词之间由空格分隔,字符串开始和结尾没有空格。#includevoidmain()charstring=Ilovemusicmorethangames;char*p=string;intn=0;while(*p!=NULL)if(*p=)n+;+p;while(*p+=);elsep+;n=n+1;printf(n=%dn,n);,#includeintat(char*,char*);intatn(char*,char*,int);voidmain()intpos;charsource101,subs21;printf(Inputastring:);gets(source);printf(Inputasubstring:);gets(subs);pos=at(subs,source);if(pos)printf(Found,Thefirstposistionis:%dn,pos+1);elseprintf(Notfoundn);pos=atn(subs,source,2);if(pos)printf(Found,Thesecondpositionis:%dn,pos+1);elseprintf(Notfoundn);,【例8-10】编写函数,查找一个字符串在另外一个字符串中的位置,intat(char*subs,char*source)char*p1,*p2;p1=source;p2=subs;while(*p1!=0,【例8-10】编写函数,查找一个字符串在另外一个字符串中的位置,intatn(char*subs,char*source,inttimes)char*p1,*p2;p1=source;p2=subs;while(*p1!=0,【例8-10】编写函数,查找一个字符串在另外一个字符串中的位置,【分析】,程序中定位函数at用于查找第1次出现的位置,atn函数用于查到第n次出现的位置,指定第几次查找的函数在查找到目标串后需要考虑次数问题。atn函数可以替代at函数,替代的形式为:atn(subs,source,1);查找算法的关键在于如何认定查找到的状态,确认找到了目标串时,正好是指针p2指向目标串的结束符,这一点非常重要,在这个状态下,指针p1指向找到位置的串的最后一个字符,所以在计算串的位置时需要减去串的长度,考虑到计数是从1开始,所以返回的位置表达式为:(int)(p1-source-(p2-subs)+1),【例8-11】编写函数,用来清理字符串中的空格,将多个连续的空格合并为一个空格,例如下面的字符串:Ilikethisgames.清理后变成:Ilikethisgames.程序如下:#include#includechar*DeleteOtherSpace(char*);voidmain()chars100;printf(Inputastring:);gets(s);printf(%sn,DeleteOtherSpace(s);,char*DeleteOtherSpace(char*s)char*p,*q;intIfFirstSpace=1;p=q=s;while(*p!=0)if(*p!=)*q+=*p+;IfFirstSpace=1;/*遇到非空格字符*/elseif(IfFirstSpace)/*遇到第1个空格字符*/*q+=*p+;IfFirstSpace=0elsep+;/*遇到第2个以上的空格字符*/*q=0;returns;,【例8-11】编写函数,用来清理字符串中的空格,将多个连续的空格合并为一个空格,8.9*计算药品使用的频次,【例8-12】王医生开了5个处方,每个处方含多种用药,请统计每种药品使用的频次。处方数据存储在下数组chardrug5200中。算法分析与设计:1.由于是统计所有处方中的药品使用频次,可以将5个处方中所有药品集中在一起统计2.统计方法的设计:建立一个简单的数据模型(这是一种解决复杂问题的良好习惯),如:AAA,BBBB,CC,DDD,AAA,BBBB,AAA,DDD,8.9*计算药品使用的频次,第1轮,统计AAA的频次:(1)通过“,”分隔符,找到第一个要统计的药品AAA(2)从第一个AAA后面开始一次查找AAA,找到了则计数,直到最后第2轮,从第一个AAA后面找到第2个要统计的药品BBBB,同法处理必须解决三个重要的问题:(1)每次开始统计时,必须记住下一轮从何处开始,例如AAA统计后需要统计BBBB,则下一轮开始的位置就是第一个AAA后面;,8.9*计算药品使用的频次,(2)重复的AAA如何处理?如上所示,统计完DDD后,又会遇到AAA,这样会导致重复统计的错误,避免的方法可以是:在统计AAA的时候,每次遇到AAA,技术后,将AAA更换成其他字符,如“-”,这样就不会重复统计了。第一轮后:AAA,BBBB,CC,DDD,-,BBBB,-,DDD第二轮后:AAA,BBBB,CC,DDD,-,-,-,DDD(3)程序何时终止由于每次统计都会记住下一轮开始的位置,所以当这个位置到达最后则结束程序。,程序,#include#include/*从字符数组s位置开始,查找合法的名称,存入t指向的字符数组中*/char*getName(char*s,char*t)while(*s=,|*s=-)s+;/*找到第一个合法的字符*/while(*s!=,程序,/*从字符数组s位置开始,查找合法的名称,逐个修改为字符-,防止重复统计*/voidclearName(char*s)while(*s=,|*s=-)s+;/找到第一个合法的字符while(*s!=,程序,voidmain()chardrug5200=丹皮,生黄芪,五味子,茵陈,炒栀子,赤芍,黄芩,石见穿,薏仁,赤芍,丹皮,柴胡,黄芩,半夏,白芥子,薏仁,黄芩,太子参,丹皮,白芥子,五味子,桃仁,赤芍,白芥子,白芷,赤芍,薏仁,丹皮,桃仁,杏仁,柴胡,黄芩,川朴,五味子,苏子,白芥子;charbuf4000=,*p,*q,*r;inti,n,len;chars50,t50;for(i=0;i5;i+)strcat(buf,drugi);strcat(

温馨提示

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

评论

0/150

提交评论