C程序课件第10章指针二.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《C程序课件第10章指针二.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序 课件 10 指针
- 资源描述:
-
1、2023-1-301l10.1 地址和指针的概念l10.2 变量的指针和指向变量的指针变量l10.3 数组的指针和指向数组的指针变量l10.4 字符串的指针和指向字符串的指针变量 本章要点2023-1-30210.5 函数的指针和指向函数的指针变量10.6 返回指针值的函数10.7 指针数组和指向指针的指针10.8 有关指针的数据类型和指针运算的小结2023-1-303 1、字符串的表示形式、字符串的表示形式在C程序中,可以用两种方法访问一个字符串。(1)用字符数组存放一个字符串,然后输出该字符串。例EX10_16 字符数组的应用#includevoid main()char string=“
2、I love China!”;printf(“%sn”,string);2023-1-304 (2)用字符指针指向一个字符串 和数组的属性一样,string也是数组名,它代表字符数组的首地址(P251图10.31)。string4代表数组中序号为4的元素(v),实际上string4就是*(string+4),string+4是一个地址,它指向字符“v”。可以不定义字符数组,而定义一个字符指针。用字符指针指向字符串中的字符。2023-1-305例EX10_16_2 字符指针的应用#includevoid main()char*string=“I love China!”;printf(“%sn”
3、,string);2023-1-306 C 语言对字符串常量是按字符数组处理的,在内存开辟了一个字符数组用来存放字符串常量。程序在定义字符指针变量string时把字符串首地址(即存放字符串的字符数组的首地址)赋给string(P252图10.32)。注意string是一个指针,而不是字符变量。语句:char*string=“I love China!”;等价于下面两行:char*string;string=“I love China!”;对字符串中字符的存取,可以用下标法,也可以用指针法。2023-1-307 (3)字符指针变量的应用 例EX10_17 输出字符串中第n个字符后的所有字符。#i
4、ncludemain()char*ps=this is a book;int n=10;ps=ps+n;printf(%sn,ps);2023-1-308例EX10_17_2 在输入的字符串中查找有无k字符。#includemain()char st20,*ps;int i;printf(input a string:n);ps=st;scanf(%s,ps);for(i=0;psi!=0;i+)if(psi=k)printf(there is a k in the stringn);printf(“The k in the string of%d charactern”,i+1);break
5、;if(psi=0)printf(There is no k in the stringn);2023-1-309例EX10_18 将字符串a复制为字符串b。要求把一个字符串的内容复制到另一个字符串中,并且不能使用strcpy函数。#includevoid main()char a=“I am a boy.”,b20;int i;for(i=0;*(a+i)!=0;i+)*(b+i)=*(a+i);*(b+i)=0;printf(“String a is:%sn”,a);printf(“String b is:”);for(i=0;bi!=0;i+)printf(“%c”,bi);printf
6、(“n”);2023-1-3010例EX10_19 用指针变量来处理例EX10_18问题。#includevoid main()char a=“I am a boy.”,b20,*p1,*p2;int i;p1=a;p2=b;for(;*p1!=0;p1+,p2+)*p2=*p1;*p2=0;printf(“String a is:%sn”,a);printf(“String b is:%sn”,b);2023-1-3011也可以把第68行简化为以下形式:while(*p2+=*p1+)!=0);即把指针的移动和赋值合并在一个语句中。进一步分析还可发现0的ASC码为0,对于while语句只看表
7、达式的值为非0就循环,为0则结束循环,因此也可省去“!=0”这一判断部分,而写为以下形式:while(*p2+=*p1+);表达式的意义可解释为,源字符向目标字符赋值,移动指针,若所赋值为非0则循环,否则结束循环。这样使程序更加简洁。在下面的程序中将会应用这一点。2023-1-3012 2、字符串指针作为函数参数、字符串指针作为函数参数 将一个字符串从一个函数传递到另一个函数,可以用地址传递的办法,即用字符数组名作参数或用指向字符串的指针变量作参数。在被调用的函数中可以改变字符串的内容,在主调函数中可以得到改变了的字符串。2023-1-3013例EX10_20 用函数调用实现字符串的复制,方法
8、一,用字符数组作参数。#includevoid copy_string(char from,char to)int i=0;while(fromi!=0)toi=fromi;i+;toi=0;void main()char a=“I am a teacher.”;char b=“you are a student.”;printf(“String a is:%snString b is:%sn”,a,b);copy_string(a,b);printf(“String a is:%snString b is:%sn”,a,b);2023-1-3014例EX10_20_2 用函数调用实现字符串的
9、复制,方法二,形参用字符指针变量。#includevoid copy_string(char*from,char*to)for(;*from!=0;from+,to+)*to=*from;*to=0;void main()char*a=“I am a teacher.”;char*b=“you are a student.”;printf(“String a is:%snString b is:%sn”,a,b);copy_string(a,b);printf(“String a is:%snString b is:%sn”,a,b);2023-1-3015 归纳起来,作为函数的参数,有以下几
10、种情况:实参形参数组名数组名字符指针变量字符指针变量数组名字符指针变量字符指针变量数组名2023-1-3016 3、对使用字符串指针变量与字符数组、对使用字符串指针变量与字符数组的讨论的讨论 用字符数组和字符指针变量都可实现字符串的存储和运算。但是两者是有区别的。在使用时应注意以下几个问题:(1)字符数组由若干个元素组成,每个元素中放一个字符,并以0作为串的结束。而字符指针变量中存放的是地址(字符串的首地址),决不是将字符串放到字符指针变量中。2023-1-3017 (2)对字符数组作初始化赋值,必须采用外部类型或静态类型,如:static char st=“C Language”;而对字符串
11、指针变量则无此限制,如:char*ps=C Language;(3)对字符串指针方式 char*ps=C Language;可以写为:char*ps;ps=C Language;而对数组方式:static char st=C Language;不能写为:char st20;st=C Language;而只能对字符数组的各元素逐个赋值。2023-1-3018 (4)如果定义了一个字符数组,在编译时为它分配内存单元,它有确定的地址。而定义一个字符指针变量时,给指针变量分配内存单元,在其中可以放一个地址值,也就是说,该指针变量可以指向一个字符数组,但如果未对它赋予一个地址值,则它并未具体指向一个确定
12、的字符数组。2023-1-3019 对数组方式:char str10;scanf(“%s”,str);是成立的,而对指针方式:char*p;scanf(“%s”,p);是不成立的,因为p并未指向一个具体的字符数组。必须写成以下的形式:char*p,str10;p=str;scanf(“%s”,p);2023-1-3020 (5)指针变量的值是可以改变的(例EX10_17)。需要说明,若定义了一个指针变量,并使它指向一个字符串,就可以用下标形式引用指针变量所指的字符串中的字符(例EX10_17_2)。(6)用指针变量指向一个格式字符串,可以用它代替printf函数中的格式字符串。如:char*f
13、ormat;format=“a=%d,b=%dn”;printf(format,a,b);相当于:printf(“a=%d,b=%dn”,a,b);从以上几点可以看出字符串指针变量与字符数组在使用时的区别,同时也可看出使用指针变量更加方便。2023-1-3021 在语言中规定,一个函数总是占用一段连续的内存区,而函数名就是该函数所占内存区的首地址。我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使该指针变量指向该函数。然后通过指针变量就可以找到并调用这个函数。我们把这种指向函数的指针变量称为“函数指针变量”。2023-1-3022 1、用函数指针调用函数、用函数指针调用函数 可以用
14、指针变量指向整型变量、字符串、数组,当然也可以指向一个函数。一个函数在编译时被分配给一个入口地址。这个入口地址就称为函数的指针。可以用一个指针变量指向函数,然后通过该指针变量调用此函数。2023-1-3023 函数指针变量定义的一般形式为:类型说明符类型说明符(*指针变量名指针变量名)();其中“类型说明符”表示被指函数的返回值的类型。“(*指针变量名)”表示“*”后面的变量是定义的指针变量。最后的空括号表示指针变量所指的是一个函数。例如:int(*pf)();表示pf是一个指向函数入口的指针变量,该函数的返回值(函数值)是整型。2023-1-3024 下面通过例子来说明用指针形式实现对函数调
15、用的方法。例EX10_23 求a和b中的大者。先写出用一般方法的程序。#includeint max(int x,int y)if(xy)return x;else return y;void main()int max(int x,int y);int a,b,c;printf(input two numbers:n);scanf(%d,%d,&a,&b);c=max(a,b);printf(a=%d,b=%d,max=%dn,a,b,c);2023-1-3025 主函数中“c=max(a,b);”包括了一次函数调用(调用max函数)。每一个函数都占用一段内存单元,它们有一个起始地址。因此,
16、可以用一个指针变量指向一个函数,通过指针变量来访问它指向的函数。改写main函数如下:void main()int max(int x,int y);int(*p)();/*定义一个指向函数的指针变量*p*/int a,b,c;p=max;/*将函数max的首地址赋予指针变量p*/printf(input two numbers:n);scanf(%d,%d,&a,&b);c=(*p)(a,b);/*通过指针变量调用该指针指向的函数*/printf(a=%d,b=%d,max=%dn,a,b,c);2023-1-3026 说明:(1)指向函数的指针变量的一般定义形式为:数据类型(*指针变量名)
17、()这里的“数据类型”是指函数返回值的类型。(2)函数的调用可以通过函数名调用,也可以通过函数指针调用(即用指向函数的指针变量调用)。2023-1-3027 (3)(*p)()表示定义一个指向函数的指针变量,它不是固定指向哪一个函数的,而只是表示定义了这样一个类型的变量,它是专门用来存放函数的入口地址的。在程序中把哪一个函数的地址赋给它,它就指向哪一个函数。在一个程序中,一个指针变量可以先后指向不同的函数。2023-1-3028 (4)在给函数指针变量赋值时,只需给出函数名而不必给出参数,如:p=max;因为将函数入口地址赋给p,而不牵涉到实参与形参的结合问题。(5)用函数指针变量调用函数时,
18、只需将(*p)代替函数名即可(p为指针变量名),在(*p)之后的括弧中根据需要写上实参。如:c=(*p)(a,b);(6)对指向函数的指针变量,指针运算是无效的。2023-1-3029 2、用指向函数的指针作函数、用指向函数的指针作函数参数参数 函数指针变量常用的用途之一是把指针作为参数传递到其他函数。这个问题是 C语言应用的一个比较深入的部分,这里只作简单介绍,以便今后进一步理解和掌握打下一点基础。2023-1-3030 例EX10_24 设一个函数process,在调用它的时候,每次实现不同的功能。输入a和b两个数,第一次调用它时找出两个数中的大者,第二次调用时找出两个数中的小者,第三次求
19、这两个数的和。2023-1-3031#includevoid main()int max(int,int);int min(int,int);int add(int,int);int a,b;printf(“Enter a and b:n”);scanf(“%d,%d”,&a,&b);printf(“Max=”);process(a,b,max);printf(“Min=”);process(a,b,min);printf(“Add=”);process(a,b,add);2023-1-3032max(int x,int y)if(xy)return x;else return y;min(i
20、nt x,int y)if(xy)return x;else return y;add(int x,int y)return(x+y);process(int x,int y,int(*fun)()int result;result=(*fun)(x,y);printf(“%dn”,result);2023-1-3033 一个函数可以带回一个整型值、字符值、实型值,也可以带回指针型的数据,即地址。在语言中允许一个函数的返回值是一个指针(即地址),这种返回指针值的函数称为指针型函数。其概念与以前类似,只是带回的值的类型是指针而已。2023-1-3034 定义指针型函数的一般形式为:类型说明符类型
21、说明符*函数名(参数表)函数名(参数表)其中函数名之前加了“*”号表明这是一个指针型函数,即返回值是一个指针。类型说明符表示了返回的指针值所指向的数据类型。2023-1-3035如:int*a(int x,int y)./*函数体函数体*/a是函数名,调用它以后能得到一个指向整型数据的指针(地址)。x、y是函数a的形参,为整型。2023-1-3036 应该特别注意的是函数指针变量和指针型函数这两者在写法和意义上的区别。如int(*p)()和int*p()是两个完全不同的量。int(*p)()是一个变量说明,说明p 是一个指向函数入口的指针变量,该函数的返回值是整型量,(*p)的两边的括号不能少
展开阅读全文