《C语言程序设计基础》第八章 指针

上传人:guoc****ang 文档编号:243039385 上传时间:2024-09-14 格式:PPT 页数:76 大小:1.27MB
返回 下载 相关 举报
《C语言程序设计基础》第八章 指针_第1页
第1页 / 共76页
《C语言程序设计基础》第八章 指针_第2页
第2页 / 共76页
《C语言程序设计基础》第八章 指针_第3页
第3页 / 共76页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,*,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第八章 指针,76,课程名称:语言程序设计,课型与教法:讲授,通过程序扩展,进行对比学习,学时:,2,课时,授课题目:,第,8,章 指针,基本教材:语言程序设计(高等教育出版社)廖雷主编,教学目的与要求:通过本章的学习使学生掌握指针的意义及使用。,教学难点:通过指针引用变量的意义,教学重点:指针的使用,第八章 指针,指针的概念,指针变量,指针与数组,指向函数的指针,返回指针值的函数,指针数组和指向指针的指针,字符指针,前言,C,程序设计中使用指针可以,:,使程序简洁、紧凑、高效,在函数调用后改变有关变量的值,高效地使用数组和字符串,动态分配内存,直接处理地址,有效地表示复杂的数据结构,完成有关文件的操作,变量与地址,程序中,:,int,i;,float k;,内存中每个字节有一个编号,-,地址,.,.,2000,2001,2002,2005,内存,0,2003,i,k,编译或函数调用时为其分配内存单元,变量,是对程序中数据,存储空间的抽象,指针的概念,2004,.,.,2000,2004,2006,2005,整型变量,i,10,变量,i,_pointer,2001,2002,2003,指针:一个变量的地址,指针变量:专门存放变量地址的变量,2000,指针,指针变量,变量的,内容,变量的,地址,指针变量,变量,变量地址,(,指针,),变量值,指向,地址存入,指针变量,指针与指针变量,含义,&:,取变量的地址,*,:,取指针所指向变量的内容,含义,:,取变量的地址,单目运算符,优先级,: 14,结合性,:,自右向左,含义,:,取指针所指向变量的内容,单目运算符,优先级,: 14,结合性,:,自右向左,两者关系:互为,逆运算,理解,.,.,2000,2004,2006,2005,整型变量,i,10,变量,i,_pointer,2001,2002,2003,2000,指针变量,i_pointer,-,指针变量,它的内容是地址量,*,i_pointer,-,指针的,目标变量,,它的内容是数据,&i_pointer,-,指针变量占用内存的地址,&i,10,i_pointer,*i_pointer,&i_pointer,i,i_pointer &i &(*i_pointer),i *i_pointer *(&i),i_pointer,=,=,&i,=,=,&(*i_pointer),i,=,*i_pointer,=,*(&i),&,与*运算符,指针变量,与其,所指向的变量,之间的关系,指针变量说明,一般形式:,*,;,3,变量,i,2000,i_pointer,i,*i_pointer,&i,i_pointer,i=3;,*i_pointer=3,3,变量,i,2000,i_pointer,i,*i_pointer,&i,i_pointer,i=3;,*i_pointer=3,合法标识符,指针的目标变量的数据类型,表示定义指针变量,不是*运算符,例,int,*,p1,*,p2;,float *q ;,static char *name;,注意:,1,、,int,*p1, *p2;,与,int,*p1, p2,;,2,、,指针变量名是,p1,p2 ,不是*,p1,*p2,3,、,指针变量只能指向定义时所规定类型的变量,4,、指针变量定义后,,变量值不确定,,应用前必须先赋值,指针变量,一般形式:,*,=,初始地址值,;,赋给指针变量,,不是赋给目标变量,例,int,i;,int,*p=,&i,;,变量必须,已说明过,类型,应一致,例,int,*p=,&i,;,int,i;,例,int,i;,int,*p=,&i,;,int,*q=,p,;,用已初始化指针变量作初值,例,main( ),int,i;,static,int,*p=,., (,),不能用,auto,变量的地址,去初始化,static,型指针,指针变量的初始化,例:,int,a,*p,*q;,printf(“%o”,p,);,scanf(“%d”,p,);,printf(“%d,”,*p);,p=,*p=5;,q=p;,指针变量的引用,/,以八进制数形式输出指针变量,p,的值,(,地址值,),/,将整型变量,a,的地址赋给指针变量,p,此时,p,指向,a,/,向,p,所指向的整型变量输入一个整型值,/,将指针变量,p,所指向的变量的值输出,/,将,5,赋给,p,所指向的变量,/,将指针变量,p,的值赋给指针变量,q,&a,a,p,&a,5,a,p,&a,5,a,p,&a,q,零指针:,(,空指针,),定义:指针变量值为零,表示:,int,* p=0;,表示,p,不指向任何对象,,,指针变量值,没有意义,p=0,与未对,p,赋值不同,用途,:,在程序中常作为,状态,比较,例,int,*p;,.,while(,p!=NULL,), .,void *,类型指针,表示:,void *p;,使用时要进行,强制类型转换,例,char *p1;,void *p2;,p1=(char *)p2;,p2=(void *)p1;,表示不指定,p,是指向哪一种,类型数据的指针变量,零指针与空类型指针,main(),int,*p1,*p2,*p,a,b;,scanf(%d,%d,&a,&b,);,p1=,if(a,b), p=p1; p1=p2; p2=p;,printf(a,=%d,b=%dn,a,b);,printf(max,=%d,min=%dn,*p1,*p2);,运行结果:,a=1,b=5,max=5,min=1,.,.,指针变量,p1,指针变量,p,2000,2008,2002,2004,2006,指针变量,p2,整型变量,b,整型变量,a,1,2006,5,2008,2006,2008,2006,例 输入两个数,并使其从大到小输出,特点:,共享内存,“,双向,”,传递,/*ch8_1.c*/,swap(int,x,int,y),int,temp;,temp=x;,x=y;,y=temp;,main(),int,a,b;,scanf(%d,%d,&a,&b,);,if(ab) swap(a,b);,printf(n%d,%dn,a,b,);,例,将数从大到小输出,.,.,2000,2008,200A,2002,2004,2006,5,变量,a,变量,b,(main),9,变量,tem,p,变量,y,变量,x,(swap),5,5,9,5,9,COPY,指针变量作为函数参数,/*ch8_1.c*/,swap(int,x,int,y),int,temp;,temp=x;,x=y;,y=temp;,main(),int,a,b;,scanf(%d,%d,&a,&b,);,if(ab),swap(a,b);,printf(n%d,%dn,a,b,);,.,.,2000,2008,200A,2002,2004,2006,5,变量,a,变量,b,(main),9,运行结果:,5, 9,特点:,共享内存,“,双向,”,传递,例,将数从大到小输出,指针变量作为函数参数,/*ch8_2.c*/,swap(int,*p1,int,*p2),int,p;,p=*p1;,*p1=*p2;,*p2=p;,main(),int,a,b;,int,*pointer_1,*pointer_2;,scanf(%d,%d,&a,&b,);,pointer_1=,if(ab),swap(pointer_1,pointer_2);,printf(n%d,%dn,a,b,);,.,2000,2008,200A,2002,2004,2006,200C,200E,2010,.,5,9,整型变量,a,整型变量,b,(main),指针,pointer_1,指针,pointer_2,2000,2002,(swap),指针,p1,指针,p2,整型,p,5,9,2000,2002,COPY,5,例,将数从大到小输出,特点:,共享内存,“,双向,”,传递,指针变量作为函数参数,/*ch8_2.c*/,swap(int,*p1,int,*p2),int,p;,p=*p1;,*p1=*p2;,*p2=p;,main(),int,a,b;,int,*pointer_1,*pointer_2;,scanf(%d,%d,&a,&b,);,pointer_1=,if(ab)swap(pointer_1,pointer_2);,printf(n%d,%dn,a,b,);,.,2000,2008,200A,2002,2004,2006,200C,200E,2010,.,5,9,整型变量,a,整型变量,b,(main),指针,pointer_1,指针,pointer_2,2000,2002,5,9,运行结果:,9,,,5,例,将数从大到小输出,特点:,共享内存,“,双向,”,传递,指针变量作为函数参数,/*ch8_3.c*/,swap(int,*p1,int,*p2),int,*p;,*p=*p1;,*p1=*p2;,*p2=*p;,main(),int,a,b;,int,*pointer_1,*pointer_2;,scanf(%d,%d,&a,&b,);,pointer_1=,if(a0),printf(b,);,count-; ,break;,default: if(0=,ch,&,ch,=9),printf(%c,ch,);,bufcount,=,ch,;,count+; ,for(i,=0;i,count;i,+),*,pintnum,=10*(*pintnum)+bufi-0;,/*ch8_6.c*/,#include ,#include ,main(), void,getint(int,*,pintnum,);,int,data;,getint(&data,);,printf(n%d,data,);,课程名称:语言程序设计,课型与教法:讲授,通过程序扩展,进行对比学习,学时:,2,课时,授课题目:,第,8,章 指针,基本教材:语言程序设计(高等教育出版社)廖雷主编,教学目的与要求:通过本章的学习学生应知数组的指针的意义,数组元素的指针的意义,及使用数组名作函数参数,字符串可以用字符数组和字符指针表示,应会通过指针引用数组元素,数组名与数组的指针作函数参数,用字符指针表示字符串,用字符串指针作函数参数实现关于字符串的常用操作。,教学难点:指针和数组的关系,教学重点:指针和数组的关系、指针的运算、用字符指针处理字符串、字符串处理函数,200,202,204,200+i*2,218,一维数组的指针表示方法,例,int,data10;,数组名,是,地址常量,,表示数组,首地址,也就是数组第一个的元素,(,下标为,0),的地址,data=&data0,data+i,与,&,datai,等价,即,data+i,=&,datai,*(,data+i,) =,datai,两种引用数组元素方法:,下标法,指针法,指针与数组,data+9,data+i,data+2,data+1,data,编译系统计算实际地址时,,data,i,data,i,d,(i,为整型数,,d,为一个元素所占字节数,),data0,data1,data2,datai,data9,.,.,例:,datai,=5;,t=data5;,data0=k;,例:,t=*(data+5);,*data=k;,*(,data+i,)=5;,推导:,data+i,=&,datai,即:*,(,data+i,)=*(&,datai,),*(,data+i,)=,datai,指向数组元素的指针变量,例,int,array10;,int,*p;,p= /*,p=array;*/,或,int,*p=,或,int,*p=array;,array0,array1,array2,array3,array9,.,指针变量,p,&array0,p,指针与数组,指针变量的赋值运算,int,a,array10,*p,*p1,*p2;,p= (,将变量,a,地址,p),p=array; (,将数组,array,首地址,p),p= (,将数组元素,arrayi,的地址,p),p1=p2; (,指针变量,p2,值,p1),p=NULL; (,将指针,p,赋空值,,p,不指向任何对象,),指针变量的关系运算,若,p1,和,p2,指向同一数组,则,p1p2,表示,p1,指的元素在后,p1=p2,表示,p1,与,p2,指向同一元素,若,p1,与,p2,不指向同一数组,比较无意义,p=NULL,或,p!=NULL,指针的运算,p+=i,(,p,指向当前对象后第,i,个对象),p,=i,(,p,指向当前对象前第,i,个对象),p+,(,p,指向下一个对象),p,(,p,指向前一个对象),p+i,(当前对象后第,i,个对象),p,i,(当前对象前第,i,个对象),若,p1,与,p2,指向同一数组,(p1p2),,,p1-p2=,两指针间元素个数,p1+p2,无意义,例,p,指向,int,型数组,且,p=,则,p+1,指向,a1,p+i,指向,ai,例,int,a10;,int,*p=,p+;,*p=1;,例,int,a10;,int,*p1=,int,*p2=,则:,p2-p1=3;,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a,数组,a,a+1,a+i,a+9,1,指针的算术运算:,p,p+1,p,p+,p1,p2,p+i,a0,a1,a2,a3,a9,.,a,a+9,a+1,a+2,地址,元素,下标法,a0,a1,a2,a9,a0,a1,a2,a3,a9,.,p,p+9,p+1,p+2,地址,元素,指针变量法,*p,*,(p+1),*,(p+2),*,(p+9),下标运算符,a,i,*(a+i),ai,pi,*(p+i),*(a+i),*a,*,(a+1),*,(a+2),*,(a+9),p0,p1,p2,p9,引用数组元素的方法,指针法,p=a;,a0,a1,a2,a3,a4,a5,/*ch8_7.c*/,#include ,main(),int,a6=0,3,6,9,12,15,*,p,i,;,for(i,=0;i6;i+),printf(a%d:%d,n,i,ai,);,for(i,=0;i6;i+),printf,(*(,a+%d):%d,n,i,*(a+i),);,p=a;,for(i,=0;i6;i+),printf(p%d:%d,n,i,pi,);,for(;p,a+6;p+),printf,(*(,pa+%d):%d,n,i,*p,);,p,例 数组元素的引用方法,0,3,6,9,12,15,例,int,a=1,2,3,4,5,6,7,8,9,10,*p=a,i;,数组元素地址的正确表示:(,A,),&(a+1),(,B,),a+,(,C,),&p,(,D,),&pi,数组名是,地址常量,p+,p- (,),a+,a- (,),a+1, *(a+2) (,),/*ch8_8.c*/,main(),int,a =5,8,7,6,2,7,3;,int,y,*p=&a1,;,y=(*-p)+;,printf(“%d,”,y);,printf(“%d”,a0);,输出:,5 6,p,p,5,8,7,6,2,7,3,0,1,2,3,4,5,6,a,6,例 注意指针变量的运算,数组作函数参数,实参与形参的对应关系,实参,形参,数组名,指针变量,数组名,指针变量,数组名,数组名,指针变量,指针变量,数组作函数参数,-1 9 7 3 -100 0 8,0 1 2 3 4 5 6 7,/*ch8_10.c*/,int,min(int,p,int,n),int,i,minvalue,;,minvalue,=p0;,for(i,=1;i,pi,),minvalue,=,pi,;,return,minvalue,;,main(),int,a=-1,9,7,3,-100,0,8;,int,minvalue,;,minvalue,=min(a,7);,printf(“minvalue,=%,dn“,minvalue,);,minvalue,= -1,例 求一数组中最小的元素值(,1,),实参与形参均用数组,i,i,i,i,minvalue,= -100,i,i,i,/*ch8_11.c*/,int,min(int,*p,int,n),int,i,minvalue,;,minvalue,=*p;,p+;,for(i,=1;i*p),minvalue,=*p;,return,minvalue,;,main(),int,a=-1,9,7,3,-100,0,8;,int,minvalue,;,minvalue,=min(a,7);,printf(“minvalue,=%,dn”,minvalue,);,实参用数组,形参用指针变量,p,-1,9,7,3,-100,0,8,a0,a1,a2,a3,a4,a5,a6,a,数组,例,求一数组中最小的元素值(,2,),minvalue,= -1,p,p,p,p,minvalue,= -100,p,p,p,/*ch8_12.c*/,int,min(int,*p,int,n),int,i,minvalue,;,minvalue,=*p;,for(i,=1;i*(,p+i,),minvalue,=*(,p+i,);,return(minvalue,);,main(),int,a=-1,9,7,3,-100,0,8;,int,minvalue,*p=a;,minvalue,=min(p,7);,printf(“minvalue,=%,dn”,minvalue,);,实参与形参均用指针变量,例,求一数组中最小的元素值(,3,),/*ch8_13.c*/,int,min(int,p,int,n),int,i,minvalue,;,minvalue,=p0;,for(i,=1;i,pi,),minvalue,=,pi,;,return,minvalue,;,main(),int,a=-1,9,7,3,-100,0,8;,int,minvalue,*p=a;,minvalue,=min(p,7);,printf(“minvalue,=%,dn”,minvalue,);,实参用指针变量,形参用数组,例,求一数组中最小的元素值(,4,),int,*p,与,int,q10,数组名是指针(地址),常量,p=q; p+i,是,qi,的地址,数组元素的表示方法,:,下标法、指针法和指针变量法,,即若,p=q,,则,pi,qi,*(p+i),*(q+i),形参数组,实质上是,指针变量,,即,int,q ,int,*q,在定义指针变量(不是形参)时,,不能把,int,*p,写成,int,p;,系统只给,p,分配能保存一个指针值的内存区,(,一般,2,字节);而给,q,分配,2*10,字节的内存区,一级指针变量与一维数组的关系,对于二维数组:,(,1,),a,是数组名,,包含三个元素,a0,a1,a2,(,2,),每个元素,ai,又是一个一维,数组,包含,4,个,元素,a,a+1,a+2,*,(*(a+0)+1),*,(,a0,+1),int,a34;,a0,a1,a2,2000,2008,2016,2000,2002,2008,2010,2016,2018,a0,0,a0,1,a1,0,a1,1,a2,0,a2,1,a0,2,a0,3,a1,2,a1,3,a2,2,a2,3,*a,*(a+1),*(a+2),*,(a+0),行指针与列指针,a0+1,*a+1,*(a+0)+1,行指针,列指针,指针与二维数组,说明形式:,(,*,指针名,),;,例,int,(*p)4;,( ),不能少,int,(*p)4,与,int,*p4,不同,p,的值是一维数组的,首地址,,p,是,行指针,可让,p,指向二维数组某一行,如,int,a3,4, (*p),4,=a;,int,a34;,a0,0,a0,1,a1,0,a1,1,a2,0,a2,1,a0,2,a0,3,a1,2,a1,3,a2,2,a2,3,a,a+1,a+2,p,p+1,p+2,p0+1,或 *,p+1,p1+2,或 *,(p+1)+2,*,(*p+1),或,(*p)1,*,(*(p+1)+2),一维数组指针变量元素个数和,二维数组,列数,必须相同,指向一维数组的指针变量,用指向变量的指针变量,用指向一维数组的指针变量,用二维数组名,实参,形参,数组名,int,x4,指针变量,int,(*q)4,数组名,int,x4,指针变量,int,(*q)4,数组名,a,数组名,a,指针变量,p1,指针变量,p1,若,int,a34;,int,(*p1)4=a;,int,*p2=a0;,指针变量,p2,指针变量,int,*q,二维数组作函数参数,例 求一个,3*4,矩阵的所有元素值之和。设矩阵为:,arr11,arr10,arr9,arr8,arr7,arr6,arr5,arr4,arr3,arr2,arr1,arr0,4,a23,-1,a22,0,a21,7,a20,5,a13,-3,a12,5,a11,2,a10,10,a03,9,a02,8,a01,3,a00,a =,3 8 9 10,2 5 -3 5,7 0 -1 4,aij,arri,*,n+j,/*ch8_24.c*/,#include ,main(),int,add(int,m,int,n,int,arr,);,int,total,a34=3,8,9,10,2,5,-3,5,7,0,-1,4;,total=,add(3,4,a0),;,printf(“total,=%,d”,total,);,int,add(int,m,int,n,int,arr,),int,i,j,sum,=0;,for(i,=0;i,m;i,+),for(j,=0;j,n;j,+),sum=,sum+arri,*,n+j,;,return sum;,例 求一个,4*4,阶矩阵中元素的最小值,#include ,int,min(int,a4),int,i,j,minvalue,;,minvalue,=a00;,for(i,=0;i4;i+),for(j,=0;j4;j+),if(aij,minvalue,),minvalue,=,aij,;,return,minvalue,;,main(), static,int,a44=1,2,3,4,9,8,7,6,-10,10,-5,2,3,5,2,8;,printf(“min,=%,d”,min(a,);,/*ch7_15.c*/,int,min(,int,(*a)4 ),函数定义形式:,*(),例,int,*,f(int,x,int,y),返回指针值的函数,字符指针,字符串表示形式,用字符数组实现,例,main( ), char string=“I love China!”;,printf(“%sn”,string,);,printf(“%sn”,string+7,);,I,l,o,v,e,C,h,i,string0,string1,string2,string3,string4,string5,string6,string7,string8,string9,string,string10,string11,string12,string13,n,!,a,0,结果:,I love China!,China!,string+7,例,main( ),char *string=“I love China!”;,printf(“%sn”,string,);,string+=7;,while(*string),putchar,(*string);,string+;,/*ch8_14.c*/,I,l,o,v,e,C,h,i,string,n,!,a,0,字符指针,初始化,:,把字符串,首地址,赋给,string,char *string;,string=“I love China!”;,string,*string!=0,用字符指针实现,结果:,I love China!,China!,例 用函数调用实现字符串复制,(,1,)用字符数组作参数,(,2,)用字符指针变量作参数,a,I,a,m,a,t,e,a,c,e,h,0,r,.,source,a,b,y,u,a,r,a,s,u,t,n,d,e,dest,b,o,e,t,.,0,I,a,a,e,c,e,h,0,r,.,t,.,0,m,t,a,void,strcopy(char,dest,char,source),int,i=0;,while(sourcei,!=0),desti,=,sourcei,;,i+;,desti,=0;, /*ch8_15.c*/,main(), char a=I am a teacher.;,char b=You are a student.;,printf(string_a,=%sn string_b=%sn,a,b);,strcopy(b,a,);,printf(nstring_a,=%,snstring_b,=%sn,a,b);,void,strcopy(char,*,dest,char,*source), for(;*source!=0;dest+,source+),*,dest,=*source;,*,dest,=0;, /*ch8_16.c*/,main(), char *a=I am a teacher.;,char *b=You are a student.;,printf(string_a,=%,snstring_b,=%sn,a,b);,strcopy(b,a,);,printf(nstring_a,=%,snstring_b,=%sn,a,b);,字符串指针作函数参数,字符串输出函数,puts ,原型:,int,puts(char,*,str,),功能:把,str,指向的字符串输出到标准输出设备,将,0,转,换为回车换行,返回值:成功,返回换行符,若失败,返回,-1,字符串输入函数,gets ,原型:,char *,gets(char,*,str,),功能:从键盘输入一以,回车结束,的字符串放入,str,所指向的字,符数组中,并,用串结束符,0,代替输入中的换行符,返回值:成功,返回,str,的值;否则,返回,NULL,说明:输入串长度应小于字符数组长度,常用的字符串处理函数,例,/*ch8_17.c*/,#include ,main( ), char,string80,,,*,str,;,printf(“Input,a string:”);,gets(string,);,gets(str,);,puts(string,);,puts(str,);,输入,:,How are you?,I am a student.,输出,:,How are you ?,I am a student.,字符串连接函数,strcat,原型:,char *,strcat(char,*s1,char *s2),功能:把字符串,s2(,包括结束符,0,),连到字符串,s1,后面,返值:返回,s1,说明:,字符数组,1,必须足够大,连接前,两串均以,0,结束,;,连接后,串,1,的,0,取消,新串以串,2,的,0,标志结束,例,#include ,#include ,main(),static char str120=“This ”;,char *str2=“is a string”;,printf(“%sn”,strcat(str1,str2),);,printf(“%sn”,strcat(str1,”!”),);,/*ch8_18.c*/,常用的字符串处理函数,结果:,This is a string,This is a string!,字符串拷贝函数,strcpy,原型:,char *,strcpy(char,*s1,char *s2),功能:将,s2,指向的字符串拷贝到,s1,中去包括结束符,0,返值:返回,s1,说明:,字符数组,1,必须足够大,拷贝时,0,一同拷贝,不能使用赋值语句为一个字符数组赋值,例,#include ,#include ,main(),char str130,,,str330;,char *str2=“This is a string”;,strcpy(str1,str2);,strcpy(str3,”That is another string”);,printf(“str1=%sn”,str1);,printf(“str3=%sn”,str3);,/*ch8_19.c*/,常用的字符串处理函数,结果:,str1=This is a string,str3=,Thst,is another string,不能写成:,str1=str2;,str3=“This is another string”,字符串比较函数,strcmp,原型:,int,strcmp(char,*s1,char *s2),功能:比较字符串,s1,s2,的大小,比较规则:对两串从左向右逐个字符比较(,ASCII,码),,直到遇到不同字符或,0,为止,返值:返回,int,型整数,,a.,若字符串,1,字符串,2,, 返回,正整数,c.,若字符串,1,=,字符串,2,, 返回,零,说明:,字符串比较不能用,“,=,”,必须用,strcmp,常用的字符串处理函数,例,char str130 =“This is a string”;,char *str3=”That is another string”;,if(!,strcmp(str1,str3),),printf(“str1=str3n”);,else,printf(“str1str3n”);,结果:,str1str3,字符串长度函数,strlen,原型:,int,strlen(char,*s),功能:计算字符串,s,的长度,返回值:返回字符串实际长度,,不包括,0,在内,例 对于以下字符串,,strlen(s,),的值为:,(,1,),char s10=A,0,B,C,0,D;,(,2,),char s =“tv0willn”;,(,3,),char s =“x69082n”;,答案:,1 3 1,常用的字符串处理函数,定位字符在字符串中位置的函数,strchr,原型:,char *,strchr(char,*s1,int c),功能:找出字符串,s1,中第一次出现字符,c,的位置,返回值:返回指向该位置的指针,不存在,则返回,NULL,常用的字符串处理函数,例,#include ,#include ,main(), char str130=“I love china!”;,char *str2=“This is a string”;,int,ch,=o;,printf(“%sn”,strchr(str1,ch),);,if(!,strchr(str2,ch),),printf(“%c,isnt in ”%s”n”,ch,str2);,/*ch8_20.c*/,结果:,ove,china!,o isnt in “This is a string”,定位子串在字符串中位置的函数,strstr,原型:,char *,strstr(char,*s1,char *s2),功能:找出字符串,s1,中第一次出现字符串,s2,的位置,返回值:返回指向该位置的指针,不存在,则返回,NULL,常用的字符串处理函数,例,#include ,#include ,main(), char str130=“I love china!”;,char *str2=“china”,*str3;,str3=,strstr(str1,str2),;,if(str3),printf(“%sn”,str3);,/*ch8_21.c*/,结果:,china!,char *cp;,与,char str20;,str,由若干元素组成,每个元素放一个字符;而,cp,中存放字符串首地址,系统只给,cp,分配能保存一个指针值的内存区;而给,str,分配,1*20,字节的内存区,str,是地址,常量,;,cp,是地址变量,char str20;,str,=“I love China!”; (,),char *cp; cp=“I love China!”; (,),cp,未赋值,则指向对象不定,接受键入字符串时,必须,先开辟存储空间,例,char str10;,scanf(“%s”,str,); (,),而,char *cp;,scanf(“%s,”, cp); (,),改为,: char *cp,str10;,cp=,str,;,scanf(“%s”,cp,); (,),字符指针变量与字符数组,例,#include ,main(), char *s=“C language”;,s+=2;,printf(“%sn”,s,);,结果:,language,例,#include ,main(), char s=“C language”;,s+=2;,printf(“%sn”,s,);,(,),动态存储分配的函数,内存申请函数,malloc, ,原型:,void *,malloc(unsigned,size),功能:在内存的动态存储区分配长度为,size,的连续空间,返回值:成功,返回新分配内存块起始地址,;,否则,返回,NULL,说明:函数的返回值是一个无类型指针,,其特点是可以指向任何类型的数据。但在实际使用,malloc,(),函数时,必须将其返回值强制转换成被赋值指针变量的数据类型,,以免出错。,例,char *s;,s=,(char *)malloc(10*,sizeof(char,),;,scanf(“%s”,s,);,动态存储分配的函数,例,char *s;,s=,(char *)malloc(10*,sizeof(char,),;,scanf(“%s”,s,);,free(s,);,释放内存空间函数,free ,原型:,void,free(void,*p),功能:释放由,p,指向的内存块,(p,是调用,malloc,(),函数的返回值,),返回值:无,说明:,原则上,使用,malloc,(),函数申请的内存块,操作结束后,应及时使用,free(),函数予以释放。,尤其是循环使用,malloc,(),函数时,如果不及时释放不再使用的内存块,很可能很快就耗尽系统的内存资源,从而导致程序无法继续运行,课程名称:语言程序设计,课型与教法:讲授,通过程序扩展,进行对比学习,学时:,2,课时,授课题目:,第,8,章 指针,基本教材:语言程序设计(高等教育出版社)廖雷主编,教学目的与要求:通过本章的学习学生应知指针数组、指向指针的指针和指向函数的指针的定义、引用、,main,函数形参的意义,应会使用指针数组处理多个字符串,编写带有形参的主函数,使用指向指针的指针和指向函数的指针和返回指针的函数解决实际的问题。,教学难点:指向指针的指针,教学重点:指针数组、带形参的,main,函数、指向函数的指针,用于处理二维数组或多个字符串,指针数组,定义:其元素为指针的数组,说明的一般形式:, *,;,例,int,*p4;,指针所指向变量的数据类型,区分,int,*p4,与,int,(*p)4,指针数组赋值与初始化,指针数组和指向指针的指针,赋值:,int,i,j,k,;,int,*p3;,p0=,p1=,p2=,P2,P1,P0,j,i,k,p,初始化:,static,int,i,j,k,;,int,*p3=&,i,&j,&k,;,L i s p 0,F o r t r a n 0,B a s i c 0,p0,p1,p2,p3,0,赋值,:,main(), char a=Fortran;,char b=Lisp;,char c=Basic;,char *p4;,p0=a; p1=b; p2=c; p3=NULL;,.,或,:,main(), char *p4;,p0= Fortran;,p1= Lisp;,p2= Basic;,p3=NULL;,.,初始化,:,main(),char *p=Fortran, Lisp, Basic,NULL;,.,L i s p 0,F o r t r a n 0,B a s i c 0,p0,p1,p2,p3,0,指针数组赋值与初始化,char name59=“gain”,“much”,“stronger”, “point”,“bye”;,char *name5=“gain”,“much”,“stronger”, “point”,“bye”;,g a i n 0,s t r o n g e r 0,p o i n t 0,m u c h 0,name0,name1,name2,name3,name4,b y e 0,g a i n 0,s t r o n g e r 0,p o i n t 0,m u c h 0,b y e 0,二维数组存储空间固定,字符指针数组相当于,可变列长,的二维数组,分配内存单元,=,数组长度*,2+,各字符串长度,(,包括,0),指针数组元素的作用相当于二维数组的行名,但指针数组中元素是指针变量,二维数组的行名是,地址常量,二维数组与指针数组区别,:,一级指针,:,指针变量中存放目标变量的地址,p1,&p2,&i,3,P2(,指针变量,),i(,整型变量,),例,int,*,p1;,int,*p2;,int,i=3;,p2=,p1=,*p1=5;,二级指针,:,指针变量中存放一级指针变量的地址,例,int,*p;,int,i=3;,p=,*p=5;,&i,3,P(,指针变量,),i(,整型变量,),一级指针,二级指针,一级指针,目标变量,指向指针的指针,说明形式:,*,;,如,char *p;,例,int,i, *p;,p=
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 小学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


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