浙江大学C颜晖原版C8_第1页
浙江大学C颜晖原版C8_第2页
浙江大学C颜晖原版C8_第3页
浙江大学C颜晖原版C8_第4页
浙江大学C颜晖原版C8_第5页
已阅读5页,还剩83页未读 继续免费阅读

下载本文档

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

文档简介

第八章指针,指针指针和数组指针和字符串指针数组和二级指针指针和函数,8.1指针,intx;x=3;printf(“%d”,x;),直接访问:通过变量名直接访问地址,间接访问:把变量的地址放到另一变量中,使用时先找到后者的地址,从中取出前者的地址,指针变量:存放地址的变量,某个变量的地址,指向,指向,intx;x=3;printf(“%d”,x;),8.1.1指针变量的定义,指针变量所指向变量的类型,int*px;px是整型指针,指向整型变量float*pf;pf是浮点型指针,指向浮点型变量char*pc;pc是字符型指针,指向字符型变量,类型名*指针变量名;,类型名*指针变量名;int*p1,*p2;等价于int*p1;int*p2;,int*px;注意:指针变量名是px,不是*px,8.1.2指针的基本操作,*p:p所指向的变量a,*p,1、把a的地址赋给p,即p指向a,输入57,输出:3,35,57,710,10,main()inta=3,*p;p=,例8.1指针运算,输出:100,10100,10,main()inta,b;int*p1,*p2;a=100;b=10;p1=,例8.2指针运算,指针运算注意事项,(1)当pp2也指向a,*p1*p2,int*p1,*p2,a=3;p1把a的地址赋给p1,即p1指向a,输出:10,100,例8.3指针赋值,main()inta,b;int*p1,*p2;a=100;b=10;p1=,8.1.3指针变量的初始化,例8.4-1voidmain()inta=1,b=2;int*p1=,8.1.3指针变量的初始化,例8.4-2voidmain()inta=1,b=2;int*p1=,8.1.4指针作为函数的参数,swap1(intx,inty)intt;t=x;x=y;y=t;,输出:3,5,例8.5main()inta=3,b=5;swap1(a,b);printf(“%d,%dn”,a,b);,swap2(int*p1,int*p2)intt;t=*p1;*p1=*p2;*p2=t;,输出:5,3,值传递,地址未变,但存放的变量的值改变了,main()inta=3,b=5;swap2(,swap3(int*p1,int*p2)int*p;p=p1;p1=p2;p2=p;,值传递,形参指针的改变不会影响实参,main()inta=3,b=5;swap2(,输出:3,5,swap2(int*p1,int*p2)intt;t=*p1;*p1=*p2;*p2=t;,main()inta=3,b=5;swap2(,要使某个变量的值通过函数调用发生改变(1)在主调函数中,把该变量的地址作为实参(2)在被调函数中,用形参(指针)接受地址(3)在被调函数中,改变形参(指针)所指向变量的值,例8.6-1指针作为函数的参数,voidp(int*a,intb)*a=*a-1;b+;voidmain()intx=3,y=5;p(,调用前main:x=3,y=5调用p:*ab3526调用后main:x=2,y=5,将变量的地址作为实参,调用后,该变量的值可能改变,例8.6-2,voidp(int*a,intb)*a=*a-1;b+;voidmain()intx=3,y=4;p(,调用前main:x=3,y=4调用p:*ab4334调用后main:x=3,y=3,例8.6-3,voidp(int*a,intb)*a=*a-1;b+;voidmain()intx=3,y=5;p(,调用前main:x=3,y=5第1次调用p:*ab3526调用后main:x=2,y=5第2次调用p:*ab5243调用后main:x=2,y=4,例7-9,自定义函数dayofyear(year,month,day),返回该年的第几天。dayofyear(2000,3,1)返回61dayofyear(1981,3,1)返回60分析:月01231112非闰年03128313031闰年03129313031,inttab213=0,31,28,31,30,31,30,31,31,30,31,30,310,31,29,31,30,31,30,31,31,30,31,30,31,例7-9,voiddayofyear(intyear,intmonth,intday)intk,leap;inttab213=0,31,28,31,30,31,30,31,31,30,31,30,310,31,29,31,30,31,30,31,31,30,31,30,31;leap=(year%4=0,例8-7,输入年和天数,输出对应的月和日。例如:输入2000和61,输出3和1。自定义函数monthday(year,yearday,pmonth,pday)带回2个结果,用2个指针作为函数的参数。,voidmain()intday,month,year,yearday;voidmonth_day(intyear,intyearday,int*pmonth,int*pday);printf(inputyearandyeardayn);scanf(%d%d,例8-7,voidmonth_day(intyear,intyearday,int*pmonth,int*pday)intk,leap;inttab213=0,31,28,31,30,31,30,31,31,30,31,30,31,0,31,29,31,30,31,30,31,31,30,31,30,31;leap=year%4=0,8.2指针和数组,8.2.1指针、数组、地址间的关系8.2.2数组名做为函数的参数,8.2.1指针、数组、地址间的关系,指针和数组有密切的关系任何由数组下标来实现的操作都能用指针来完成。inta10;,数组名是一个指针它的值是数组首元素的地址即它指向数组的首元素,int*ap;ap=ap指向数组a的首元素,*(a+i),ap,ap+i,*(ap+i),ai的地址i10;i+)printf(”%d”,*(a+i),for(ap=a;apa+10;ap+)printf(”%d”,*ap),注意:数组名a是指针常量,不能a+,for(i=0;i10;i+)printf(”%d”,ai),例:输出数组a所有元素,1、数组元素作为函数实参函数形参为变量(与变量作为函数实参相同,值传递)2、数组名作为函数参数由于数组名是指针常量,相当于指针作为函数的参数数组名做为实参形参是指针变量(数组),8.2.2数组名作为函数的参数,floataverage(float*array)inti;floataver,sum=0;for(i=0;i10;i+)sum+=arrayi;aver=sum/10;return(aver);,main()floatscore10,aver;inti;for(i=0;i10;i+)scanf(“%f”,(1)实参是数组名(2)形参是指针变量可以写成数组形式可以不指定长度,例8.8求平均分,floataverage(float*array)inti;floataver,sum=0;for(i=0;i10;i+)sum+=arrayi;aver=sum/10;return(aver);,main()floatscore10,aver;inti;for(i=0;i10;i+)scanf(“%f”,*(array+i),(3)若在函数中只处理部分数组元素,用参数指定个数,floataverage(float*array,intn)inti;floataver,sum=0;for(i=0;is1strcmp(s1,s2)若s1=s2,函数值为0若s1s2,函数值0string.h若s1s2,函数值0strlen(str)计算字符串的有效长度,不包括0,字符串处理函数小结,8.3.2字符串的指针表示,1、用字符数组表示字符串staticcharsa=“Thisisastring.”;printf(“%s”,sa);printf(“%s”,“Hello”);,2、用字符指针表示字符串字符串是一个指针常量它的值就是该字符串的首地址,由于字符串是一个指针常量定义一个字符指针,接收字符串指针常量char*sp=Thisisastring.;printf(%s,sp);,8.3.2字符串的指针表示,staticcharsa=“Thisisastring.”;printf(“%s”,sa);printf(“%s”,“Hello”);,1、使用字符指针进行字符串操作实现字符串复制函数strcpy(s1,s2),8.3.3字符数组和字符指针,voidstrcpy(chars1,chars2)inti;for(i=0;s2i!=0;i+)s1i=s2i;s1i=0;,voidstrcpy(chars1,chars2)inti=0;while(s1i=s2i)i+;,用字符指针实现字符串复制函数strcpy(s1,s2),voidstrcpy(chars1,chars2)inti=0;while(s1i=s2i)i+;,voidstrcpy(char*s1,char*s2)while(*s1=*s2)s1+;s2+;,voidstrcpy(char*s1,char*s2)while(*s1+=*s2+);,数组:改变下标指针:直接改变指针,实现字符串长度函数strlen(str),intstrlen(charstr)inti=0;while(stri!=0)i+;returni;,intstrlen(char*str)char*t=str;while(*str!=0)str+;returnstr-t;,实现字符串比较函数strcmp(s1,s2),intstrcmp(chars1,chars2)inti;for(i=0;s1i!=0;i+)if(s1i!=s2i)break;returns1i-s2i;,strcmp(char*s1,char*s2)for(;*s1!=0;+s1,+s2)if(*s1!=*s2)break;return(*s1-*s2);,staticcharsa=“Thisisastring.”;字符数组sa由若干元素组成的,每个元素放一个字符,有确定的地址。char*sp=“Thisisastring.”;字符指针是一个接收字符串首地址的变量,不能将字符串放到字符指针变量中去。在对指针赋值前,它的值是不确定的。,2、字符指针和字符数组的区别,staticcharsa=“Thisisastring.”;char*sp=“Thisisastring.”;,staticcharsa80;char*sp;,数组,指针常量,有确定的地址,指针,变量,strcpy(sa,“Thisisastring.”),sa=“Thisisastring.”;sp=“Thisisastring.”;,#includestdio.hmain()staticcharsa=“string”;/*设sa的值2000*/char*sp;/*设sp的值1fff*/printf(nsa=%x,sp=%xn,sa,sp);sp=sa;printf(sa=%x,sp=%xn,sa,sp);printf(%s,sa);printf(%sn,sp);,输出:2000,1fff2000,2000string,string,例8.10,#includestdio.hmain()charsa80;/*设sa的值2000*/char*sp=“Thisisastring”;/*设sp的值1fff*/printf(nsa=%x,sp=%xn,sa,sp);strcpy(sa,sp);printf(sa=%x,sp=%xn,sa,sp);printf(%s,sp);printf(%sn,sp);,输出:2000,1fff2000,1fffstring,string,指针变量必须先定义,后使用。例如:char*p;scanf(%s,p);可能出现难以预料的结果而char*s,str20;s=str;scanf(%s,s);是正确的.,8.4指针数组和二级指针,8.4.1指针数组8.4.2二级指针8.4.3指针数组和字符串,inti;inta10;a是一个数组,它有10个元素,每个元素的类型都是整型。int*p;int*pa10;pa是一个数组,它有10个元素,每个元素的类型都是整型指针。,8.4.1指针数组,inta10;,int*pa10;,inti,j,k,m;int*pa4;,pa0=,*pa0,*pa1,*pa2,*pa3,inti=1,j=2,k=3,m=4;int*pa4=,for(n=0;n4;n+)printf(“%x”,pan);,for(n=0;n4;n+)printf(“%d”,*pan);,inti=1,j=2,k=3,m=4;int*pa4=,for(pp=pa;pppa+4;pp+)printf(“%x”,*pp);,pp,*pp,*pp,for(pp=pa;pppa+4;pp+)printf(“%x”,*pp);,inti=1,j=2,k=3,m=4;int*pa4=如何定义pp,int*pp;,8.4.2二级指针(指向指针的指针),main()inta=10;int*p=,int*p=,输出:a=10,b=80,*p=10,*pp=10a=10,b=80,*p=80,*pp=80,char*name4=“Wang”,“Li”,“Zhao”,“Jin”;,8.4.3指针数组和字符串,printf(“%sn”,name0);printf(“%c”,*name0);,输出:WangW,char*name4=“Wang”,“Li”,“Zhao”,“Jin”;,输出:WangLiZhaoJin,for(i=0;i4;i+)printf(“%s”,namei);,for(i=0;i4;i+)printf(“%c”,*namei);,输出:WLZJ,输入月,输出相应的英文名称。#includemain()intmonth;scanf(%d,例8.11,prnname(intm)char*name=January,February,March,April,May,June,July,August,September,October,November,December;printf(%3d:%sn,m,namem-1);,char*name4=“Wang”,“Li”,“Zhao”,“Jin”;char*pp=name;printf(“%sn”,*pp);printf(“%c”,*pp);,输出:WangW,char*name4=“Wang”,“Li”,“Zhao”,“Jin”;char*pp=name;printf(“%sn”,*pp);,输出:Wang,pp=pp+2;printf(“%sn”,*pp);printf(“%c”,*pp);,ZhaoZ,char*name4=“Wang”,“L

温馨提示

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

评论

0/150

提交评论