《C语言程序设计(第三版)》课件第8章 指针.ppt

上传人(卖家):momomo 文档编号:7375496 上传时间:2023-12-12 格式:PPT 页数:40 大小:654KB
下载 相关 举报
《C语言程序设计(第三版)》课件第8章 指针.ppt_第1页
第1页 / 共40页
《C语言程序设计(第三版)》课件第8章 指针.ppt_第2页
第2页 / 共40页
《C语言程序设计(第三版)》课件第8章 指针.ppt_第3页
第3页 / 共40页
《C语言程序设计(第三版)》课件第8章 指针.ppt_第4页
第4页 / 共40页
《C语言程序设计(第三版)》课件第8章 指针.ppt_第5页
第5页 / 共40页
点击查看更多>>
资源描述

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

2、执行效率,更加方便地特点,提高某些程序的执行效率,更加方便地表示和访问复杂的数据结构、直接对内存操作表示和访问复杂的数据结构、直接对内存操作等等。8.1 指针的概念指针的概念 lC语言允许使用变量名、数组名语言允许使用变量名、数组名下标下标、函数、函数名等标识符来访问内存名等标识符来访问内存 l指针其实就是在内存中的地址,它可能是变量指针其实就是在内存中的地址,它可能是变量的地址,也可能是函数的入口地址的地址,也可能是函数的入口地址 l变量指针变量指针存储的地址是变量的地址存储的地址是变量的地址l函数指针函数指针存储的地址是函数的入口地址存储的地址是函数的入口地址l指针变量指针变量也简称为指针

3、,是指它是一个变量,也简称为指针,是指它是一个变量,且该变量是指针类型的且该变量是指针类型的 8.2 指针变量的定义和初始化指针变量的定义和初始化 l定义指针变量的形式如下:定义指针变量的形式如下:l数据类型数据类型*指针变量名指针变量名;l定义并初始化的形式为:定义并初始化的形式为:l数据类型数据类型*指针变量名指针变量名=&变量名变量名;l例如:例如:lint a;lint *p=&a;l或者:或者:lint a,*p=&a;l没有指向的指针变量的值是随机的,称为没有指向的指针变量的值是随机的,称为“野指野指针针”。指针变量与指针变量与 变量的关系变量的关系lint a,*pa=&a;8.

4、3 指针运算指针运算 l8.3.1 *运算符和取地址运算符运算符和取地址运算符&lint a=1000,*pa=&a;l*(&a)=a l&(*p)=p l指向运算符指向运算符 *和取地址运算符和取地址运算符&互逆互逆 l不能写成不能写成:*(&p)8.3.2 指针变量的引用指针变量的引用 l【例例8-1】演示指针变量的引用演示指针变量的引用void swap1(int x,int y)int temp;temp=x;x=y;y=temp;void swap2(int*x,int*y)int temp;temp=*x;*x=*y;*y=temp;void swap3(int*x,int*y)i

5、nt*temp;temp=x;x=y;y=temp;void main()int a,b;int*pa,*pb;pa=&a;pb=&b;a=10,b=20;swap1(a,b);printf(a=%d,b=%d,*pa=%d,*pb=%dn,a,b,*pa,*pb);a=10,b=20;swap2(pa,pb);printf(a=%d,b=%d,*pa=%d,*pb=%dn,a,b,*pa,*pb);a=10,b=20;swap3(pa,pb);printf(a=%d,b=%d,*pa=%d,*pb=%dn,a,b,*pa,*pb);【例例8-1】演示指针变量的引用演示指针变量的引用。lswa

6、p1(int x,int y),主函数调用方式为,主函数调用方式为:lswap1(a,b);l值传递,值传递,a、b的值以及的值以及pa、pb指针变量都不受影响。指针变量都不受影响。lswap2(int*x,int*y),主函数调用方式为,主函数调用方式为:lswap2(pa,pb);l形参是指针变量,实参也是指针变量。交换算法中采用指向运算形参是指针变量,实参也是指针变量。交换算法中采用指向运算符符*,所以,所以*x、*y和和pa、pb是对应相同的数据是对应相同的数据a、b,最后函数实现,最后函数实现了交换。了交换。lswap3(int*x,int*y),主函数调用方式为,主函数调用方式为:

7、lswap3(pa,pb);l形参是指针变量,实参也是指针变量。交换算法中临时指针变量形参是指针变量,实参也是指针变量。交换算法中临时指针变量虽然把虽然把x、y交换,但交换,但pa、pb没有交换,所以对应的数据没有交换,所以对应的数据a、b也没也没有受到影响,交换是失败的。有受到影响,交换是失败的。【例例8-1】演示指针变量的引用演示指针变量的引用。lswap3()分析图分析图8.3.3 指针的算术运算和关系运算指针的算术运算和关系运算 l算术运算l指针变量的指针变量的+和和-运算。运算。l指针加、减整数运算。指针加、减整数运算。l指向同一数组不同元素的指针相减运算。指向同一数组不同元素的指针

8、相减运算。l假定有:假定有:lchar str100=Hello World;lchar*p=str,*q;8.3.3 指针的算术运算和关系运算指针的算术运算和关系运算p+q=p+3;字符字符W可以用可以用str6表示,也可以用表示,也可以用p5、q2表示表示 8.3.3 指针的算术运算和关系运算指针的算术运算和关系运算l关系运算关系运算 l关系运算是比较指针大小的运算。两个指针关系运算是比较指针大小的运算。两个指针相等说明指向同一存储单元。相等说明指向同一存储单元。lpql指针不能进行如下等运算:指针不能进行如下等运算:lp+qlp*qlp/ql8.4 指针与数组指针与数组 l8.4.1 指

9、针与字符数组指针与字符数组 lchar str100=Hello World;lchar*p=str;l字符字符w可以有如下多种表示形式可以有如下多种表示形式:lstr6l*(str+6)lp6l*(p+6)【例例8-2】演示指针和数组的关系。演示指针和数组的关系。#include void main()char str100=123456789;char*p=str;char des100,*q;while(*p!=NULL)printf(%c,*p+);/*顺序输出顺序输出*/printf(n);while(-p=str)printf(%c,*p);/*逆序输出逆序输出*/printf(n

10、);p=str;q=des;while(*p!=NULL)*q+=*p+;/*字符串拷贝字符串拷贝*/*q=NULL;printf(%sn,des);return 0;8.4.2 指针与其他类型数组指针与其他类型数组 l【例例8-3】演示指针和整型数组的关系,数组动态分配演示指针和整型数组的关系,数组动态分配内存。内存。#include void main()int a10=1,2,3,4,5,6,7,8,9,10;int*p=a,*q=p+9;int s;for(s=0;q=p;q-)s=s+*q;printf(s=%dn,s);8.4.3 指针与二维数组指针与二维数组 l二维数组其实可以看

11、成由一维数组构造而成。就二维数组其实可以看成由一维数组构造而成。就相当于几个队列构成一个相当于几个队列构成一个方阵方阵,方阵由,方阵由队列队列组成,组成,队列由具体的元素队列由具体的元素-人人组成。组成。l一级指针只能管理队列,如果管理方阵,则需要一级指针只能管理队列,如果管理方阵,则需要二级指针。二级指针。lint a=1000,*pa,*ppa;lpa=&a;lppa=&pa;l*(*(ppa)*(pa)a 10008.4.3 指针与二维数组指针与二维数组l二级指针演示图二级指针演示图【例例8-4】演示指针和二维数组的关系演示指针和二维数组的关系main()int s,t;int a34;

12、int*p3,*q;int i,j;s=t=0;for(i=0;i 3;i+)pi=ai;for(j=0;j 4;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);【分析分析】lint*p3是指针数组。是指针数组。l所谓指针数组,首先是一个数组,只不过其元素不是所谓指针数组,首先是一个数组,只不过其元素不是普通的变量,而是指针变量。即普通的变量,而是指针变量。即p0、p1、p2相相当于前面提到的指针变量。当于前面提到的指针变量。l单独的指针变量可以指向一

13、个一维数组,例如例题中单独的指针变量可以指向一个一维数组,例如例题中的数组的数组a的第一行的第一行【分析分析】lp是指针数组的数组名是指针数组的数组名 la12用用p表示就是表示就是*(*(p+1)+2),其实就是,其实就是*(p1+2)、*(a1+2)【总结总结】lp是二级指针是二级指针l*p相当于相当于*(p+0),级别级别降低降低为一级指针为一级指针,相当于相当于p0l*p相当于相当于*(*(p+0)+0),级别级别降低降低为数组元素为数组元素(普通变普通变量量),也相当于,也相当于p00lp12,相当于相当于*(*(p+1)+2)l&p12,级别级别提升提升为一级指针为一级指针,相当于

14、相当于:lp1+2,*(p+1)+2l&p1,级别级别提升提升为二级指针为二级指针,相当于相当于:lp+18.5 指针与函数指针与函数 l8.5.1 指针作为函数的参数指针作为函数的参数 int swap2(int*x,int*y)int temp;temp=*x;*x=*y;*y=temp;return 0;l实际调用该函数时,如:实际调用该函数时,如:lswap2(&a,&b);l调用时,把实参的指针传送给形参,即传送调用时,把实参的指针传送给形参,即传送&a、&b,这是函数参数的引用传递。但是,作为指针本身,仍这是函数参数的引用传递。但是,作为指针本身,仍然是函数参数的值传递方式。因为在

15、然是函数参数的值传递方式。因为在swap函数中创建函数中创建的临时指针在函数返回时被释放,它不能影响调用函的临时指针在函数返回时被释放,它不能影响调用函数中的实参指针(即地址)值数中的实参指针(即地址)值 8.5 指针与函数指针与函数l8.5.2 函数指针函数指针l函数名代表了函数在内存中的入口地址函数名代表了函数在内存中的入口地址 lint (*Copy)(const char*,const char*);lCopy=&strcpy;/*Copy 指向指向strcpy函数函数*/l&运算符可以省略:运算符可以省略:lCopy=strcpy;/*Copy 指向指向strcpy函数函数*/l下面

16、的下面的3个调用是等价的:个调用是等价的:lstrcpy(des,str);/*直接调用直接调用*/l(*Copy)(des,str);/*间接调用间接调用*/lCopy(des,str);/*间接调用间接调用*/【例例8-5】演示函数指针。演示函数指针。#include#include int sum(int n)int i,s=0;for(i=1;i=n;i+)s=s+i;return s;main()double(*s)(double)=&sin;double PI=3.1415926;int(*f)(int);int n=100;printf(sin(PI/2)=%fn,s(PI/2)

17、;f=sum;printf(1+2+3+.+100=%dn,f(n);。【例例8-6】演示函数指针演示函数指针2。#include#include int f1(int a,int b)return a+b;int f2(int a,int b)return a-b;int f3(int a,int b)return a*b;int f4(int a,int b)if(b!=0)return a/b;else printf(errorn);return 0;【例例8-6】演示函数指针演示函数指针2。int f5(int a,int b)if(b!=0)return a%b;elseprintf

18、(errorn);return 0;int f6(int n)int i,s=0;for(i=1;i=n;i+)s=s+i;return s;int f7(int n)int i,s=1;for(i=1;i=n;i+)s=s*i;return s;【例例8-6】演示函数指针演示函数指针2。int f8(int a,int b,int c)return a+b+c;void main()int(*f)();int a,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=%

19、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.5.3 返回指针的函数返回指针的函数 l函数的返回值可以是一个指针。需要返回指针函数的返回值可以是一个指针。需要返回指针的函数,其类型必须也是指针类型。例如:的函数,其类型必须也是指针类型。例如:char*copy(char*s,char*t)return s;l函数名函数

20、名copy和其返回值和其返回值s的类型都是的类型都是 char*。l注意注意copy是函数名,是一个指针常量,如果定义成:是函数名,是一个指针常量,如果定义成:lchar(*copy)();加上括号的;加上括号的copy 是指针变量。是指针变量。l定义成指针变量的形式没有函数体部分,变量定义成指针变量的形式没有函数体部分,变量是简单的实体,不能再包括其他代码。是简单的实体,不能再包括其他代码。【例例8-7】设计一个类似于设计一个类似于strcpy的函数的函数#include char*copy(char*s,char*t)char*p=s,*q=t;while(*p!=0)p+;while(*

21、q!=0)p+=q+;*p=0;return s;main()char s100=Hello;char t=World!;printf(%sn,copy(s,t);8.6 程序示例程序示例 l【例例8-8】编写一个查找字符位置的函数。编写一个查找字符位置的函数。int atc(char*string,char c)int pos=0;while(*string !=c&*string!=NULL)pos+;string+;if(*string=NULL)return 0;else return pos+1;void main()char str=Hello World!;int pos;pos

22、=atc(str,o);if(pos!=0)printf(os position is:%dn,pos);else printf(not found the char on);pos=atc(str,k);pos!=0?printf(ks position is:%dn,pos):printf(not found the char kn);【例例8-9】用指针方法统计字符串用指针方法统计字符串I love music more than games 中单词的个数。中单词的个数。l规定单词由字母组成,单词之间由空格分隔,规定单词由字母组成,单词之间由空格分隔,字符串开始和结尾没有空格。字符串开始

23、和结尾没有空格。#include void main()char string=I love music more than games;char*p=string;int n=0;while(*p!=NULL)if(*p=)n+;+p;while(*p+=);else p+;n=n+1;printf(n=%dn,n);【例例8-10】编写一个函数用来查找一个字符串在编写一个函数用来查找一个字符串在另外一个字符串中的位置,注意有可能出现多次,另外一个字符串中的位置,注意有可能出现多次,要求能够查找指定次数出现的位置。要求能够查找指定次数出现的位置。#include int at(char*,c

24、har*);int atn(char*,char*,int);void main()int pos;char source101,subs21;printf(Input a string:);gets(source);printf(Input a substring:);gets(subs);pos=at(subs,source);if(pos)printf(Found,The first posistion is:%dn,pos+1);elseprintf(Not foundn);pos=atn(subs,source,2);if(pos)printf(Found,The second po

25、sition is:%dn,pos+1);elseprintf(Not foundn);【例例8-10】编写一个函数用来查找一个字符串在编写一个函数用来查找一个字符串在另外一个字符串中的位置,注意有可能出现多次,另外一个字符串中的位置,注意有可能出现多次,要求能够查找指定次数出现的位置。要求能够查找指定次数出现的位置。int at(char*subs,char*source)char*p1,*p2;p1=source;p2=subs;while(*p1!=0&*p2!=0)if(*p1=*p2)p2+;if(*p2=0)return(int)(p1-source-(p2-subs)+1);el

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

27、lse p2=subs;times-;elsep2=subs;p1+;return 0;【分析分析】l程序中定位函数程序中定位函数at用于查找第用于查找第1次出现的位置,次出现的位置,atn函函数用于查到第数用于查到第n次出现的位置,指定第几次查找的函次出现的位置,指定第几次查找的函数在查找到目标串后需要考虑次数问题。数在查找到目标串后需要考虑次数问题。atn函数可函数可以替代以替代at函数,替代的形式为:函数,替代的形式为:latn(subs,source,1);l查找算法的关键在于如何认定查找到的状态,确认找查找算法的关键在于如何认定查找到的状态,确认找到了目标串时,正好是指针到了目标串时

28、,正好是指针p2指向目标串的结束符,指向目标串的结束符,这一点非常重要,在这个状态下,指针这一点非常重要,在这个状态下,指针p1指向找到位指向找到位置的串的最后一个字符,所以在计算串的位置时需要置的串的最后一个字符,所以在计算串的位置时需要减去串的长度,考虑到计数是从减去串的长度,考虑到计数是从1开始,所以返回的开始,所以返回的位置表达式为:位置表达式为:l(int)(p1-source-(p2-subs)+1)【例例8-11】编写一个函数用来清理一个字符串中编写一个函数用来清理一个字符串中的空格,将多个连续的空格合并为一个空格的空格,将多个连续的空格合并为一个空格 l例如下面的字符串:例如下

29、面的字符串:lI like this games.l清理后变成:清理后变成:lI like this games.l程序如下:程序如下:#include#include char*DeleteOtherSpace(char*);void main()char s100;printf(Input a string:);gets(s);printf(%sn,DeleteOtherSpace(s);【例例8-11】编写一个函数用来清理一个字符串中编写一个函数用来清理一个字符串中的空格,将多个连续的空格合并为一个空格的空格,将多个连续的空格合并为一个空格char*DeleteOtherSpace(ch

30、ar*s)char*p,*q;int IfFirstSpace=1;p=q=s;while(*p!=0)if(*p!=)*q+=*p+;IfFirstSpace=1;/*遇到非空格字符遇到非空格字符*/elseif(IfFirstSpace)/*遇到第遇到第1个空格字符个空格字符*/*q+=*p+;IfFirstSpace =0else p+;/*遇到第遇到第2个以上的空格字符个以上的空格字符*/*q=0;return s;l本章介绍了指针的概念以及指针变量的定义和本章介绍了指针的概念以及指针变量的定义和初始化等。初始化等。C语言的指针变量形式有:语言的指针变量形式有:l一级指针变量:一级指针

31、变量:int*p,p可指向变量、数组元素。可指向变量、数组元素。l二级指针变量:二级指针变量:int*pp,pp可指向一级指针变量。可指向一级指针变量。l指向一维数组的指针变量:指向一维数组的指针变量:int(*p)n,可用于二,可用于二维数组的行指针变量。维数组的行指针变量。l指针数组:指针数组:int*pn,元素是一级指针变量。,元素是一级指针变量。l指向函数的指针变量:指向函数的指针变量:int(*p)(),p可指向一个函可指向一个函数。数。l返回指针的函数:返回指针的函数:int*f(),f函数返回一个一级函数返回一个一级指针。指针。l指针的运算包括变量的取地址运算指针的运算包括变量的

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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 大学
版权提示 | 免责声明

1,本文(《C语言程序设计(第三版)》课件第8章 指针.ppt)为本站会员(momomo)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|