第8章 指针.ppt

上传人:hyn****60 文档编号:70380574 上传时间:2023-01-19 格式:PPT 页数:44 大小:730.50KB
返回 下载 相关 举报
第8章 指针.ppt_第1页
第1页 / 共44页
第8章 指针.ppt_第2页
第2页 / 共44页
点击查看更多>>
资源描述

《第8章 指针.ppt》由会员分享,可在线阅读,更多相关《第8章 指针.ppt(44页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第第8 8章章 指针指针 理解并掌握地址、指针和指针变量的概念理解并掌握地址、指针和指针变量的概念练掌握指针变量的定义、初始化和引用方法练掌握指针变量的定义、初始化和引用方法理解并掌握指针与数组的关系理解并掌握指针与数组的关系了解指针数组和多级指针的概念了解指针数组和多级指针的概念了解指针与函数的关系了解指针与函数的关系学会在程序设计中正确应用指针解决实际问题学会在程序设计中正确应用指针解决实际问题 引言引言 指针是指针是C C语言区别于其他程序设计语言的主要特征语言区别于其他程序设计语言的主要特征之一。之一。正确灵活地使用指针可以充分地发挥正确灵活地使用指针可以充分地发挥C C语言的特点,语

2、言的特点,提高某些程序的执行效率,更加方便地表示和访问提高某些程序的执行效率,更加方便地表示和访问复杂的数据结构、直接对内存操作等复杂的数据结构、直接对内存操作等 。8.1 借钱的故事借钱的故事如果有位远方的朋友向你借如果有位远方的朋友向你借1000010000元钱,请你选择下面两种元钱,请你选择下面两种方式之一:方式之一:从信用卡从信用卡(x x,如:如:6222 0013 0210 1234 567)6222 0013 0210 1234 567)转给他转给他1000010000元;元;用你的信用卡用你的信用卡(x x)办理的网上银行账号办理的网上银行账号(p p,如:如:3401 340

3、1 0320 1203 0333 333)0320 1203 0333 333)转给他转给他1000010000元。元。两种方式都可以。两种方式都可以。x x和和p p都是存取银行存款的方式。通过都是存取银行存款的方式。通过x x直直接可存取,由于接可存取,由于p p中存储的是中存储的是x x的信息。访问的信息。访问p p可以获取可以获取x x的信的信息,再对银行存款进行操作。息,再对银行存款进行操作。8.1 借钱的故事借钱的故事8.2 指针的概念指针的概念 C C语言允许使用变量名、数组名语言允许使用变量名、数组名 下标下标、函数名等、函数名等标识符来访问内存标识符来访问内存 指针其实就是在

4、内存中的地址,它可能是变量的地指针其实就是在内存中的地址,它可能是变量的地址,也可能是函数的入口地址址,也可能是函数的入口地址 变量指针变量指针存储的地址是变量的地址存储的地址是变量的地址函数指针函数指针存储的地址是函数的入口地址存储的地址是函数的入口地址指针变量指针变量也简称为指针,是指它是一个变量,且该也简称为指针,是指它是一个变量,且该变量是指针类型的变量是指针类型的 8.3 指针变量的定义和初始化指针变量的定义和初始化 定义指针变量的形式如下:定义指针变量的形式如下:数据类型数据类型 *指针变量名指针变量名;定义并初始化的形式为:定义并初始化的形式为:数据类型数据类型*指针变量名指针变

5、量名=&=&变量名变量名;例如:例如:intint a;a;intint *p=&a;p=&a;或者:或者:intint a,a,*p=&a;p=&a;没有指向的指针变量的值是随机的,称为没有指向的指针变量的值是随机的,称为“野指针野指针”。指针变量与指针变量与 变量的关系变量的关系intint a,*pa=&a;a,*pa=&a;8.4 指针运算指针运算 8.4.1 8.4.1 *运算符和取地址运算符运算符和取地址运算符&intint a=1000,*pa=&a;a=1000,*pa=&a;*(&a)=a *(&a)=a&(*p)=p&(*p)=p 指向运算符指向运算符 *和取地址运算符和取

6、地址运算符&互逆互逆 不能写成不能写成:*(&p)*(&p)8.4.2 指针变量的引用指针变量的引用【例例8-18-1】演示指针变量的引用演示指针变量的引用void swap1(int x,void swap1(int x,intint y)inty)int temp;temptemp;temp=x;xx;x=y;yy;y=temp;=temp;void swap2(int*x,void swap2(int*x,intint*y)inty)int temp;temptemp;temp=*x;*x=*y;*y=temp;=*x;*x=*y;*y=temp;void swap3(int*x,voi

7、d swap3(int*x,intint*y)inty)int*temp;temptemp;temp=x;xx;x=y;yy;y=temp;=temp;void main()void main()intint a,ba,b;intint*pa,*pa,*pbpb;pa=&a;pa=&a;pbpb=&b;=&b;a=10,b=20;swap1(a,b);a=10,b=20;swap1(a,b);printf(aprintf(a=%=%d,bd,b=%d,*pa=%d,*=%d,*pa=%d,*pbpb=%=%dn,a,bdn,a,b,*pa,*,*pa,*pbpb););a=10,b=20;sw

8、ap2(pa,pb);a=10,b=20;swap2(pa,pb);printf(aprintf(a=%=%d,bd,b=%d,*pa=%d,*=%d,*pa=%d,*pbpb=%=%dn,a,bdn,a,b,*pa,*,*pa,*pbpb););a=10,b=20;swap3(pa,pb);a=10,b=20;swap3(pa,pb);printf(aprintf(a=%=%d,bd,b=%d,*pa=%d,*=%d,*pa=%d,*pbpb=%=%dn,a,bdn,a,b,*pa,*,*pa,*pbpb););【例例8-1】演示指针变量的引用演示指针变量的引用。swap1swap1(int

9、(int x,intx,int y)y),主函数调用方式为,主函数调用方式为:swap1(a,b);swap1(a,b);值传递,值传递,a a、b b的值以及的值以及papa、pbpb指针变量都不受影响。指针变量都不受影响。swap2swap2(int*(int*x,intx,int*y)*y),主函数调用方式为,主函数调用方式为:swap2(pa,pb);swap2(pa,pb);形参是指针变量,实参也是指针变量。交换算法中采用指向运算符形参是指针变量,实参也是指针变量。交换算法中采用指向运算符*,所以,所以*x x、*y y和和papa、pbpb是对应相同的数据是对应相同的数据a a、b

10、 b,最后函数实现了交,最后函数实现了交换。换。swap3swap3(int*(int*x,intx,int*y)*y),主函数调用方式为,主函数调用方式为:swap3(pa,pb);swap3(pa,pb);形参是指针变量,实参也是指针变量。交换算法中临时指针变量虽形参是指针变量,实参也是指针变量。交换算法中临时指针变量虽然把然把x x、y y交换,但交换,但papa、pbpb没有交换,所以对应的数据没有交换,所以对应的数据a a、b b也没有受也没有受到影响,交换是失败的。到影响,交换是失败的。【例例8-1】演示指针变量的引用演示指针变量的引用。swap3()swap3()分析图分析图8.

11、4.3 指针的算术运算和关系运算指针的算术运算和关系运算 算术运算指针变量的指针变量的+和和-运算。运算。指针加、减整数运算。指针加、减整数运算。指向同一数组不同元素的指针相减运算。指向同一数组不同元素的指针相减运算。假定有:假定有:char str100=Hello World;char str100=Hello World;char*p=char*p=strstr,*q;,*q;8.4.3 指针的算术运算和关系运算指针的算术运算和关系运算p+p+q=p+3;q=p+3;字符字符W可以用可以用str6表示,也可以用表示,也可以用p5、q2表示表示 8.4.3 指针的算术运算和关系运算指针的算

12、术运算和关系运算关系运算关系运算 关系运算是比较指针大小的运算。两个指针相等说明指关系运算是比较指针大小的运算。两个指针相等说明指向同一存储单元。向同一存储单元。pqpq指针不能进行如下等运算:指针不能进行如下等运算:p+qp+qp*qp*qp/qp/q8.5 指针与数组指针与数组 8.5.1 8.5.1 指针与字符数组指针与字符数组 charchar str100=Hello World;str100=Hello World;charchar*p=*p=strstr;字符字符w w可以有如下多种表示形式可以有如下多种表示形式:str6str6*(str+6)*(str+6)p6p6*(p+6

13、)*(p+6)【例例8-2】演示指针和数组的关系。演示指针和数组的关系。#include#include void main()void main()char str100=123456789;char str100=123456789;char*p=char*p=str;charstr;char des100,*q;des100,*q;while(*p!=NULL)while(*p!=NULL)printf(%cprintf(%c,*p+);/*,*p+);/*顺序输出顺序输出*/printf(nprintf(n););while(-p=while(-p=strstr)printf(%cpr

14、intf(%c,*p);/*,*p);/*逆序输出逆序输出*/printf(nprintf(n););p=p=strstr;q=des;q=des;while(*p!=NULL)*q+=*p+;/*while(*p!=NULL)*q+=*p+;/*字符串拷贝字符串拷贝*/*q=NULL;*q=NULL;printf(%sn,desprintf(%sn,des););return 0;return 0;8.5.2 指针与其他类型数组指针与其他类型数组【例例8-38-3】演示指针和整型数组的关系,数组动态分配内存。演示指针和整型数组的关系,数组动态分配内存。#include#include voi

15、d main()void main()intint a10=1,2,3,4,5,6,7,8,9,10;a10=1,2,3,4,5,6,7,8,9,10;intint*p=a,*q=p+9;*p=a,*q=p+9;intint s;s;for(sfor(s=0;q=p;q-)=0;q=p;q-)s=s+*q;s=s+*q;printf(sprintf(s=%=%dn,sdn,s););8.5.3 指针与二维数组指针与二维数组 二维数组其实可以看成由一维数组构造而成。就相当于二维数组其实可以看成由一维数组构造而成。就相当于几个队列构成一个几个队列构成一个方阵方阵,方阵由,方阵由队列队列组成,队列由

16、具体组成,队列由具体的元素的元素-人人组成。组成。一级指针只能管理队列,如果管理方阵,则需要二级指一级指针只能管理队列,如果管理方阵,则需要二级指针。针。intint a=1000,*pa,*a=1000,*pa,*ppappa;pa=&a;pa=&a;ppappa=&pa;=&pa;*(*(*(*(ppappa)*(pa)a 1000)*(pa)a 10008.5.3 指针与二维数组指针与二维数组二级指针演示图二级指针演示图【例例8-4】演示指针和二维数组的关系演示指针和二维数组的关系main()main()intint s,ts,t;intint a34;a34;intint*p3,*q;

17、*p3,*q;intint i,j i,j;s=t=0;s=t=0;for(ifor(i=0;i 3;i+)=0;i 3;i+)pipi=aiai;for(jfor(j=0;j 4;j+)=0;j 4;j+)aijaij=i*3+j;=i*3+j;for(ifor(i=0;i3;i+)=0;i3;i+)q=q=pipi;for(jfor(j=0;j4;j+)s=s+*(*(=0;j4;j+)s=s+*(*(p+i)+jp+i)+j);t=t+*();t=t+*(q+jq+j););printf(sprintf(s=%=%d,td,t=%=%dn,s,tdn,s,t););【分析分析】intin

18、t*p3*p3是指针数组。是指针数组。所谓指针数组,首先是一个数组,只不过其元素不是普通的所谓指针数组,首先是一个数组,只不过其元素不是普通的变量,而是指针变量。即变量,而是指针变量。即p0p0、p1p1、p2p2相当于前面提到的相当于前面提到的指针变量。指针变量。单独的指针变量可以指向一个一维数组,例如例题中的数组单独的指针变量可以指向一个一维数组,例如例题中的数组a a的第一行的第一行 【分析分析】p p是指针数组的数组名是指针数组的数组名 a12a12用用p p表示就是表示就是 *(*(p+1)+2)(*(p+1)+2),其实就是,其实就是*(p1+2)(p1+2)、*(a1+2)(a1

19、+2)【分析分析】【总结总结】p p是二级指针是二级指针*p p相当于相当于*(p+0),(p+0),级别级别降低降低为一级指针为一级指针,相当于相当于p0p0*p*p相当于相当于*(*(p+0)+0),(*(p+0)+0),级别级别降低降低为数组元素为数组元素(普通变普通变量量),也相当于,也相当于p00p00p12,p12,相当于相当于*(*(p+1)+2)(*(p+1)+2)&p12,&p12,级别级别提升提升为一级指针为一级指针,相当于相当于:p1+2,*(p+1)+2p1+2,*(p+1)+2&p1,&p1,级别级别提升提升为二级指针为二级指针,相当于相当于:p+1p+18.6 指针

20、与函数指针与函数 8.6.1 8.6.1 指针作为函数的参数指针作为函数的参数 intint swap2swap2(int*x,(int*x,intint*y)*y)intint temp;temp=*x;*x=*y;*y=temp;temp;temp=*x;*x=*y;*y=temp;return 0;return 0;实际调用该函数时,如:实际调用该函数时,如:swap2(&a,&b);swap2(&a,&b);调用时,把实参的指针传送给形参,即传送调用时,把实参的指针传送给形参,即传送&a&a、&b&b,这是函数参数的引用传递。但是,作为指针本身,仍这是函数参数的引用传递。但是,作为指针

21、本身,仍然是函数参数的值传递方式。因为在然是函数参数的值传递方式。因为在swapswap函数中创函数中创建的临时指针在函数返回时被释放,它不能影响调用建的临时指针在函数返回时被释放,它不能影响调用函数中的实参指针(即地址)值函数中的实参指针(即地址)值 8.6 指针与函数指针与函数8.6.2 8.6.2 函数指针函数指针函数名代表了函数在内存中的入口地址函数名代表了函数在内存中的入口地址 intint (*(*CopyCopy)(const)(const char*,const char*);char*,const char*);CopyCopy=&=&strcpystrcpy;/*Copy;

22、/*Copy 指向指向strcpystrcpy函数函数*/&运算符可以省略:运算符可以省略:CopyCopy=strcpystrcpy;/*Copy/*Copy 指向指向strcpystrcpy函数函数*/下面的下面的3 3个调用是等价的:个调用是等价的:strcpystrcpy(des,strdes,str););/*/*直接调用直接调用*/(*(*CopyCopy)()(des,strdes,str););/*/*间接调用间接调用*/CopyCopy(des,strdes,str););/*/*间接调用间接调用*/【例例8-5】演示函数指针。演示函数指针。#include#include#

23、include#include intint sum(intsum(int n)n)intint i,si,s=0;=0;for(ifor(i=1;i=n;i+)s=s+i;=1;i=n;i+)s=s+i;return s;return s;main()main()double(*double(*s s)(double)(double)=&)=&sinsin;double PI=3.1415926;double PI=3.1415926;intint(*(*f f)(int)(int););intint n=100;n=100;printf(sin(PI/2)=%fn,printf(sin(P

24、I/2)=%fn,s s(PI/2);(PI/2);f f=sumsum;printf(1+2+3+.+100=%printf(1+2+3+.+100=%dn,dn,f f(n(n););。【例例8-6】演示函数指针演示函数指针2。#include#include#include#include intint f1(int f1(int a,inta,int b)b)return return a+ba+b;intint f2(int f2(int a,inta,int b)b)return a-b;return a-b;intint f3(int f3(int a,inta,int b)b)

25、return a*b;return a*b;intint f4(int f4(int a,inta,int b)b)if(bif(b!=0)!=0)return a/b;return a/b;else else printf(errorn);returnprintf(errorn);return 0;0;【例例8-6】演示函数指针演示函数指针2。intint f5(int f5(int a,inta,int b)b)if(bif(b!=0)!=0)return return a%ba%b;elseelse printf(errorn);returnprintf(errorn);return 0

26、;0;intint f6(int n)f6(int n)intint i,si,s=0;=0;for(ifor(i=1;i=n;=1;i=n;i+)si+)s=s+i;=s+i;return s;return s;intint f7(int n)f7(int n)intint i,si,s=1;=1;for(ifor(i=1;i=n;=1;i=n;i+)si+)s=s*i;=s*i;return s;return s;【例例8-6】演示函数指针演示函数指针2。intint f8(int f8(int a,inta,int b,intb,int c)c)return return a+b+ca+

27、b+c;void main()void main()intint(*f)();(*f)();intint a,b,ca,b,c;a=53;a=53;b=44;b=44;c=35;c=35;f=f1;f=f1;printf(a+bprintf(a+b=%=%dn,f(a,bdn,f(a,b););f=f2;f=f2;printf(a-bprintf(a-b=%=%dn,f(a,bdn,f(a,b););f=f3;f=f3;printf(aprintf(a*b=%*b=%dn,f(a,bdn,f(a,b););f=f4;f=f4;printf(a/bprintf(a/b=%=%dn,f(a,bdn

28、,f(a,b););f=f5;f=f5;printf(a%bprintf(a%b=%=%dn,f(a,bdn,f(a,b););f=f6;printf(1+2+3+.+100=%dn,f(100);f=f6;printf(1+2+3+.+100=%dn,f(100);f=f7;printf(1*2*3*.*8=%dn,f(8);f=f7;printf(1*2*3*.*8=%dn,f(8);f=f8;f=f8;printf(a+b+cprintf(a+b+c=%=%dn,f(a,b,cdn,f(a,b,c););8.6.3 返回指针的函数返回指针的函数 函数的返回值可以是一个指针。需要返回指针的

29、函数,其类函数的返回值可以是一个指针。需要返回指针的函数,其类型必须也是指针类型。例如:型必须也是指针类型。例如:char*char*copycopy(char(char*s,chars,char*t)*t)return s;return s;函数名函数名copycopy和其返回值和其返回值s s的类型都是的类型都是 char*char*。注意注意copycopy是函数名,是一个指针常量,如果定义成:是函数名,是一个指针常量,如果定义成:char(*char(*copycopy)()();加上括号的;加上括号的copy copy 是指针变量。是指针变量。定义成指针变量的形式没有函数体部分,变量

30、是简单的实体,定义成指针变量的形式没有函数体部分,变量是简单的实体,不能再包括其他代码。不能再包括其他代码。【例例8-7】设计一个类似于设计一个类似于strcpy的函数的函数#include#include char*char*copy(charcopy(char*s,chars,char*t)*t)char*p=s,*q=t;char*p=s,*q=t;while(*p!=0)p+;while(*p!=0)p+;while(*q!=0)p+=q+;while(*q!=0)p+=q+;*p=0;*p=0;return s;return s;main()main()char s100=Hello

31、;char s100=Hello;char t=World!;char t=World!;printf(%sn,copy(s,tprintf(%sn,copy(s,t););8.7 案例:字符的查找案例:字符的查找intint atc(charatc(char*string,charstring,char c)c)intint pos=0;pos=0;while(*string !=c&*string!=NULL)while(*string !=c&*string!=NULL)pospos+;+;stringstring+;+;if(*string=NULL)if(*string=NULL)r

32、eturn 0;return 0;else else return return pos+1pos+1;void main()void main()char char strstr=Hello World!;=Hello World!;intint pos;pos;pos=pos=atc(str,oatc(str,o););if(posif(pos!=0)!=0)printf(osprintf(os position position is:%dn,posis:%dn,pos););else else printf(notprintf(not found the char found the

33、char onon););pos=pos=atc(str,katc(str,k););pos!=0?pos!=0?printf(ksprintf(ks position position is:%dn,posis:%dn,pos):printf(notprintf(not found the char found the char knkn);8-9 统计单词的个数统计单词的个数【例例8-98-9】用指针方法统计字符串用指针方法统计字符串I love music more than games I love music more than games 中单词的个数。规定单词由字母组成,单词之间

34、由空格分隔,中单词的个数。规定单词由字母组成,单词之间由空格分隔,字符串开始和结尾没有空格。字符串开始和结尾没有空格。#include#include void main()void main()char string=I love music more than games;char string=I love music more than games;char*p=string;char*p=string;intint n=0;n=0;while(*p!=NULL)while(*p!=NULL)if(*p=)n+;if(*p=)n+;+p;whilep;while(*p+=);(*p+=

35、);else else p+;p+;n=n+1;n=n+1;printf(nprintf(n=%=%dn,ndn,n););【例例8-10】编写一个函数用来查找一个字符串在另外一个字符串中编写一个函数用来查找一个字符串在另外一个字符串中的位置,注意有可能出现多次,要求能够查找指定次数出现的位置。的位置,注意有可能出现多次,要求能够查找指定次数出现的位置。#include#include intint at(charat(char*,char*);*,char*);intint atn(charatn(char*,char*,*,char*,intint););void main()void m

36、ain()intint pos;pos;char source101,subs21;char source101,subs21;printf(Inputprintf(Input a string:);a string:);gets(sourcegets(source););printf(Inputprintf(Input a substring:);a substring:);gets(subsgets(subs););pos=pos=at(subs,sourceat(subs,source););if(posif(pos)printf(Found,Theprintf(Found,The fi

37、rst first posistionposistion is:%is:%dndn,pos+1);,pos+1);elseelseprintf(Notprintf(Not foundn);foundn);pos=atn(subs,source,2);pos=atn(subs,source,2);if(posif(pos)printf(Found,Theprintf(Found,The second position is:%second position is:%dndn,pos+1);,pos+1);elseelseprintf(Notprintf(Not foundn);foundn);【

38、例例8-10】编写一个函数用来查找一个字符串在另外一个字符串中编写一个函数用来查找一个字符串在另外一个字符串中的位置,注意有可能出现多次,要求能够查找指定次数出现的位置。的位置,注意有可能出现多次,要求能够查找指定次数出现的位置。intint at(charat(char*subs,charsubs,char*source)*source)char*p1,*p2;char*p1,*p2;p1=source;p1=source;p2=subs;p2=subs;whilewhile(*p1!=0&*p2!=0)(*p1!=0&*p2!=0)if(*p1=*p2)if(*p1=*p2)p2p2+;+

39、;if(*p2=0)if(*p2=0)return(int)(return(int)(p1-source-(p2-subs)+1p1-source-(p2-subs)+1););elseelsep2p2=subs;=subs;p1p1+;+;return 0;return 0;【例例8-10】编写一个函数用来查找一个字符串在另外一个字符串中编写一个函数用来查找一个字符串在另外一个字符串中的位置,注意有可能出现多次,要求能够查找指定次数出现的位置。的位置,注意有可能出现多次,要求能够查找指定次数出现的位置。intint atn(charatn(char*subs,charsubs,char*so

40、urce,intsource,int times)times)char*p1,*p2;char*p1,*p2;p1=source;p1=source;p2=subs;p2=subs;whilewhile(*p1!=0&*p2!=0)(*p1!=0&*p2!=0)if(*p1=*p2)if(*p1=*p2)p2+;p2+;if(*p2=0)if(*p2=0)if(timesif(times=1)return(int)(=1)return(int)(p1-source-(p2-subs)+1p1-source-(p2-subs)+1););else else p2p2=subs;=subs;tim

41、es-;times-;else elsep2p2=subs;=subs;p1p1+;+;return 0;return 0;【分析分析】程序中定位函数程序中定位函数atat用于查找第用于查找第1 1次出现的位置,次出现的位置,atnatn函数用于函数用于查到第查到第n n次出现的位置,指定第几次查找的函数在查找到目次出现的位置,指定第几次查找的函数在查找到目标串后需要考虑次数问题。标串后需要考虑次数问题。atnatn函数可以替代函数可以替代atat函数,替代的函数,替代的形式为:形式为:atn(subs,source,1);atn(subs,source,1);查找算法的关键在于如何认定查找到

42、的状态,确认找到了目查找算法的关键在于如何认定查找到的状态,确认找到了目标串时,正好是指针标串时,正好是指针p2p2指向目标串的结束符,这一点非常重指向目标串的结束符,这一点非常重要,在这个状态下,指针要,在这个状态下,指针p1p1指向找到位置的串的最后一个字指向找到位置的串的最后一个字符,所以在计算串的位置时需要减去串的长度,考虑到计数符,所以在计算串的位置时需要减去串的长度,考虑到计数是从是从1 1开始,所以返回的位置表达式为:开始,所以返回的位置表达式为:(int)(p1-source-(p2-subs)+1)(int)(p1-source-(p2-subs)+1)【例例8-11】编写一

43、个函数用来清理一个字符串中的空格,将多个连编写一个函数用来清理一个字符串中的空格,将多个连续的空格合并为一个空格续的空格合并为一个空格 例如下面的字符串:例如下面的字符串:I like this games.I like this games.清理后变成:清理后变成:I like this games.I like this games.程序如下:程序如下:#include#include#include#include char*char*DeleteOtherSpace(charDeleteOtherSpace(char*);*);void main()void main()char s1

44、00;char s100;printf(Inputprintf(Input a string:);a string:);gets(sgets(s););printf(%sn,printf(%sn,DeleteOtherSpaceDeleteOtherSpace(s(s););【例例8-11】编写一个函数用来清理一个字符串中的空格,将多个连编写一个函数用来清理一个字符串中的空格,将多个连续的空格合并为一个空格续的空格合并为一个空格char*char*DeleteOtherSpace(charDeleteOtherSpace(char*s)*s)char*p,*q;char*p,*q;intint

45、 IfFirstSpaceIfFirstSpace=1;=1;p=q=s;p=q=s;while(*p!=0)while(*p!=0)if(*p!=)if(*p!=)*q+=*q+=*p+;IfFirstSpacep+;IfFirstSpace=1;/*=1;/*遇到非空格字符遇到非空格字符*/elseelseif(if(IfFirstSpaceIfFirstSpace)/*)/*遇到第遇到第1 1个空格字符个空格字符*/*q+=*p+;*q+=*p+;IfFirstSpaceIfFirstSpace =0 =0else p+;/*else p+;/*遇到第遇到第2 2个以上的空格字符个以上的

46、空格字符*/*q=0;*q=0;return s;return s;本章介绍了指针的概念以及指针变量的定义和初始化等。本章介绍了指针的概念以及指针变量的定义和初始化等。C C语言的指针变量形式有:语言的指针变量形式有:一级指针变量:一级指针变量:intint*p*p,p p可指向变量、数组元素。可指向变量、数组元素。二级指针变量:二级指针变量:intint*pp*pp,pppp可指向一级指针变量。可指向一级指针变量。指向一维数组的指针变量:指向一维数组的指针变量:intint(*(*p)np)n,可用于二维数组,可用于二维数组的行指针变量。的行指针变量。指针数组:指针数组:intint*pnp

47、n,元素是一级指针变量。,元素是一级指针变量。指向函数的指针变量:指向函数的指针变量:intint(*p)()(*p)(),p p可指向一个函数。可指向一个函数。返回指针的函数:返回指针的函数:intint*f()*f(),f f函数返回一个一级指针。函数返回一个一级指针。指针的运算包括变量的取地址运算指针的运算包括变量的取地址运算“&”&”和指针的指向运算和指针的指向运算“*”“*”。“&”&”和和“*”“*”是一对互逆的运算符。除此以外,指是一对互逆的运算符。除此以外,指针变量还可以进行受限制的算术运算、赋值运算和关系运算。针变量还可以进行受限制的算术运算、赋值运算和关系运算。指针可以指向

48、常变量、数组、函数。特别是指针作为函数的指针可以指向常变量、数组、函数。特别是指针作为函数的参数时,函数的参数传递方式变成地址传递,相对于值传递参数时,函数的参数传递方式变成地址传递,相对于值传递和引用传递有质的不同。和引用传递有质的不同。指针具有很大的灵活性和风险性,同时也是指针具有很大的灵活性和风险性,同时也是C C语言功能强大语言功能强大的基础条件之一,希望读者认真学习。的基础条件之一,希望读者认真学习。写一个函数,求一个字符串的长度写一个函数,求一个字符串的长度 输入一个字符串,将其逆序输出。输入一个字符串,将其逆序输出。输入一行字符,将其中的每个字符从小到大排列后输出。输入一行字符,将其中的每个字符从小到大排列后输出。从字符串中删除子字符串。从键盘输入一字符串,然后输入从字符串中删除子字符串。从键盘输入一字符串,然后输入要删除的子字符串,最后输出删除子串后的新字符串。要删除的子字符串,最后输出删除子串后的新字符串。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 生活常识

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁