(5.9.4)--翻转课补充课件-第20讲-指针(四)--指针和二维数组、指针数组.ppt

上传人:奉*** 文档编号:96384314 上传时间:2023-11-19 格式:PPT 页数:42 大小:2.16MB
返回 下载 相关 举报
(5.9.4)--翻转课补充课件-第20讲-指针(四)--指针和二维数组、指针数组.ppt_第1页
第1页 / 共42页
(5.9.4)--翻转课补充课件-第20讲-指针(四)--指针和二维数组、指针数组.ppt_第2页
第2页 / 共42页
点击查看更多>>
资源描述

《(5.9.4)--翻转课补充课件-第20讲-指针(四)--指针和二维数组、指针数组.ppt》由会员分享,可在线阅读,更多相关《(5.9.4)--翻转课补充课件-第20讲-指针(四)--指针和二维数组、指针数组.ppt(42页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、C语言程序设计语言程序设计 The C Programming Language 第第20讲讲 指针(四)指针(四)-指针和二维数组、指针数组、指针与函数指针和二维数组、指针数组、指针与函数-2-第第20讲讲 指针(四)指针(四)指针和二维数组、指针数组、指针与函数指针和二维数组、指针数组、指针与函数指针和二维数组指针和二维数组通过指针变量引用字符串通过指针变量引用字符串指针的进一步讨论指针的进一步讨论作业布置作业布置6.5.26.5.2 指针和二维数组指针和二维数组【例例6.14】编写一个使用指针与二编写一个使用指针与二维数组的程序。维数组的程序。P185#include main()int

2、 i=0,j=0,a32=1,2,3,4,5,6;int(*p)2;p=a;for(i=0;i3;i+)for(j=0;j2;j+)printf(%5d,pij);printf(n);p后方括号中的值与数组后方括号中的值与数组a的列数相等时才合法的列数相等时才合法 虽然虽然p是指向是指向a数组的指数组的指针,但可用下标形式针,但可用下标形式 定义定义p为行指针,要求为行指针,要求p后方括号后方括号中的值与数组中的值与数组a的列数相等的列数相等 printf(%x,%x,%xn,a,a+1,a+2);printf(%x,%x,%xn,p,p+1,p+2);输出数组各行首地址输出数组各行首地址 输

3、出数组每一行第输出数组每一行第1个元素的地址个元素的地址 运行结果:运行结果:1 2 3 4 5 612ff60,12ff68,12ff7012ff60,12ff68,12ff70a00a01a10a11a20a21123456ap int a32=1,2,3,4,5,6,(*p)2;p=a;(1)C语言规定,语言规定,a表示表示a00的地址,的地址,a+1表示下一行第一个元素表示下一行第一个元素a10的地址,的地址,而而a+2表示表示a20的地址。的地址。(2)从运行结果知道,从运行结果知道,p、p+1、p+2表示表示的地址值分别与的地址值分别与a、a+1、a+2的值相同,的值相同,这说明指

4、针变量这说明指针变量p和二维数组名和二维数组名a的变化规的变化规律完全一样,因为律完全一样,因为int (*p)2;,其中,其中2正正好与数组的列数相等。好与数组的列数相等。说明:说明:(3)在本程序中,在本程序中,由于由于p指向指向a,而且,而且p与与a的变化规律一样,所以可用的变化规律一样,所以可用pij替代替代aij进行输出。进行输出。(4)需要注意的是,如果需要注意的是,如果p不指向不指向a(即不(即不进行赋值操作进行赋值操作p=a)或者定义)或者定义int (*p)2;中,中,内的值与内的值与a数组的列不相同,这时数组的列不相同,这时都不能用都不能用pij代替代替aij。(5)由于由

5、于p的变化是按行进行的变化是按行进行,所以把,所以把p称称为行指针。为行指针。说明:说明:行指针的一般形式:行指针的一般形式:类型名类型名 (*指针名指针名)m;例如:例如:int (*p)m;(1)其中圆括号()不能丢,否则其中圆括号()不能丢,否则“int *pm”定义的是指针数组,而不是行指针。定义的是指针数组,而不是行指针。因为运算符因为运算符“”的优先级高于的优先级高于“*”,p先与先与m 结合,构成数组结合,构成数组pm,然后,然后pm与与*相结合,说明数组相结合,说明数组pm中的每一中的每一个元素都是指针变量,即个元素都是指针变量,即pm是指针数组。是指针数组。(2)m的取值应是

6、正整数,的取值应是正整数,m的值必须与的值必须与指针变量指针变量p所指的数组的列数(即数组每所指的数组的列数(即数组每行元素的个数)相等。行元素的个数)相等。说明:说明:【例例6.15】观察下面程序的运行结果。观察下面程序的运行结果。#include main()int i=0;char a34=0,(*p)4;printf(Input 3 string:n);for(p=a;pa+3;p+)gets(p0);printf(Output 3 string:n);for(i=0;i3;i+)puts(ai);用移动行指针用移动行指针的方法的方法 用改变第用改变第1个下标的个下标的方法方法 运行结

7、果:运行结果:a03a00 a01a20a21ABDEFGa02a22 a23C00 0H0a0a1a2ap C语言处理语言处理char a34,将二维数组,将二维数组a看作由看作由3个元素个元素a0、a1、a2组成的一维数组,而每个组成的一维数组,而每个元素又看作能存放元素又看作能存放4个字符的一维数组。个字符的一维数组。(1)C语言中在处理二维数组时,将其看语言中在处理二维数组时,将其看成为一个包含特殊元素的一维数组,而这成为一个包含特殊元素的一维数组,而这特殊元素是一个一维数组。特殊元素是一个一维数组。(2)当行指针当行指针p指向二维数组指向二维数组a时,时,p0代代表该数组第一行的首地

8、址,所以可通过语表该数组第一行的首地址,所以可通过语句句gets(p0)为数组的第一行输入字符串;为数组的第一行输入字符串;用用p+移动指针后,移动指针后,p0代表第代表第2行的首地行的首地址,所以这时的语句址,所以这时的语句gets(p0)是给第是给第2行输入字符串;同理,继续移动指针,可行输入字符串;同理,继续移动指针,可给第给第3行输入字符串。行输入字符串。说明:说明:(3)C语言规定,语言规定,a0、a1、a2 分别代表分别代表第第1、第、第2、第、第3行的首地址,因此程序中的行的首地址,因此程序中的“for(i=0;i3;i+)puts(ai);”等价等价“for(p=a;pa+3;

9、p+)puts(p0);”。说明:说明:【例例6.16】编写一个编写一个引用二维数组各元素的程序引用二维数组各元素的程序#include main()int a32=0,(*p)2,i=0,j=0;p=a;a00=1;p01=2;(*(a+1)0=3;*(a1+1)=4;*(*(a+2)+0)=5;*(*(p+2)+1)=6;for(i=0;i3;i+)for(j=0;j2;j+)printf(%5d,*(*(p+i)+j);printf(n);运行结果:运行结果:1 2 3 4 5 6(1)二维数组元素二维数组元素可分别用以下形式可分别用以下形式表示:表示:aij、pij、(*(a+i)j、

10、(*(p+i)j*(ai+j)、*(pi+j)、*(*(a+i)+j)、*(*(p+i)+j)(其中(其中0=i3,0=j2)。)。(2)二维数组元素的二维数组元素的地址地址可分别用以下形式可分别用以下形式表示:表示:&aij、&pij、&(*(a+i)j)、&(*(p+i)j)、ai+j、pi+j、*(a+i)+j、*(p+i)+j (其中(其中0=i3,0=j2)。)。说明:说明:7.7.2 7.7.2 带参数的带参数的mainmain函数函数1.指针数组指针数组 2.指向指针的指针指向指针的指针3.指针数组名做实参指针数组名做实参4.带参数的主函数带参数的主函数P222【例例7.19】指

11、针数组的示例:假设有若干指针数组的示例:假设有若干个字符串,它们分别由指针数组中的每个字符串,它们分别由指针数组中的每一个元素指向。找出最小的字符串,并一个元素指向。找出最小的字符串,并使指针数组的第一个元素指向它,而原使指针数组的第一个元素指向它,而原来指向最小字符串的数组元素指向第来指向最小字符串的数组元素指向第1个个字符串。字符串。1.1.指针数组指针数组#include#include main()int i=0,k=0;char*temp=NULL;char*p4;p0=Zhang;p1=Li;p2=Chen;p3=Wang;for(i=0;i4;i+)if(strcmp(pi,pk

12、)0)k=i;temp=p0;p0=pk;pk=temp;for(i=0;i%sn,i,pi);char*p4;定义指针数组,包含定义指针数组,包含4个元素个元素p0=Zhang;p1=Li;p2=Chen;p3=Wang;使指针数组元素分别指向使指针数组元素分别指向4个字符串个字符串运行结果:运行结果:p0-Chenp1-Lip2-Zhangp3-Wang定义指针数组的一般形式定义指针数组的一般形式类类型型名名*数数组组名名1常常量量表表达达式式1,*数组名数组名2常量表达式常量表达式2,;代表数组长度代表数组长度 讨论题讨论题7.47.4 假设有若干个字符串,指针数组中的假设有若干个字符串

13、,指针数组中的每一个元素分别指向它们。如何将这每一个元素分别指向它们。如何将这些字符串按由小到大的顺序输出?些字符串按由小到大的顺序输出?2.2.指向指针的指针指向指针的指针 int i,*p;p=&i;pi*p 如何定义一个指针使其指向如何定义一个指针使其指向p?pi*pw int i,*p,*w;p=&i;w=&p;指向指针的指向指针的指针指针*w*w3 3指针数组名做实参指针数组名做实参【例例7.20】指针数组名做实参示例:调用指针数组名做实参示例:调用函数实现例函数实现例7.19的功能。的功能。#include#include void mymin(char*w,int n);main

14、()char*p4;int i=0;p0=Zhang;p1=Li;p2=Chen;p3=Wang;mymin(p,4);printf(after:n);for(i=0;i%sn,i,pi);printf(n);mymin(p,4);指针数组名做实参指针数组名做实参void mymin(char*w,int n)int i=0,k=0;char*temp=NULL;for(i=1;in;i+)if(strcmp(wi,wk)0)k=i;temp=w0;w0=wk;wk=temp;指针数组名做实参,形参为指向指针的指针变量指针数组名做实参,形参为指向指针的指针变量4 4带参数的主函数带参数的主函数

15、【例例7.21】带参数的带参数的main函数示例:改写函数示例:改写例例7.19。#include#include main(int argc,char*argv)int i=0,k=1;char*temp=NULL;for(i=2;iargc;i+)if(strcmp(argvi,argvk)0)k=i;temp=argv1;argv1=argvk;argvk=temp;for(i=1;i%sn,i,argvi);printf(n);main(int argc,char*argv)main带两个参数带两个参数argc的值是命令行中输入的字符串个数的值是命令行中输入的字符串个数argv的指向由

16、命令行输入的字符串决定的指向由命令行输入的字符串决定(1)编辑、编译和连接程序)编辑、编译和连接程序(2)执行)执行工程工程|设置设置,在,在“Debug”选项卡的选项卡的“程序程序变量变量”中输入中输入“Zhang Li Chen Wang”,确定后运行,确定后运行程序程序带参带参main函数的执行过程函数的执行过程说明:说明:(1)主函数中带有两个参数,一个是整型)主函数中带有两个参数,一个是整型变量,另一个是指向字符型指针变量的指变量,另一个是指向字符型指针变量的指针变量,其名字由用户给定,一般用针变量,其名字由用户给定,一般用argc和和argv(2)argc的值和的值和argv的指向

17、由命令行中的的指向由命令行中的输入内容决定输入内容决定7.7.3 7.7.3 指向函数的指针指向函数的指针【例例7.22】编写一个指针变量指向函数编写一个指针变量指向函数的程序。的程序。P226#include long int mysum(int n);long int myfac(int n);main()int n=0;long x=0;long(*p)(int n);scanf(%d,&n);p=mysum;x=(*p)(n);printf(sum=%ldn,x);p=myfac;x=(*p)(n);printf(fac=%ldn,x);long int mysum(int n)int

18、 i=0;long sum=0;for(i=1;i=n;i+)sum=sum+i;return sum;long int myfac(int n)int i=0;long fac=1;for(i=1;i=n;i+)fac=fac*i;return fac;long(*p)(int n);定义指向函数的指针变量定义指向函数的指针变量p=mysum;p指向指向mysum函数函数x=(*p)(n);等价于等价于x=mysum(n);p=myfac;p指向指向myfac函数函数x=(*p)(n);等价于等价于x=myfac(n);5sum=15fac=120大学计算机大学计算机A(一一)-C语言程序设

19、计语言程序设计 温州大学瓯江学院温州大学瓯江学院 34返回指针值的函数返回指针值的函数所谓函数类型是指函数返回值的类型。在语言中允许一所谓函数类型是指函数返回值的类型。在语言中允许一个函数的返回值是一个指针个函数的返回值是一个指针(即地址即地址),这种返回指针值的,这种返回指针值的函数称为指针型函数。函数称为指针型函数。定义指针型函数的一般形式为:定义指针型函数的一般形式为:类型说明符类型说明符*函数名函数名(形参表形参表);其中函数名之前加了其中函数名之前加了“*”号表明这是一个指针型函数,号表明这是一个指针型函数,即返回值是一个指针。类型说明符表示了返回的指针即返回值是一个指针。类型说明符

20、表示了返回的指针值所指向的数据类型。如:值所指向的数据类型。如:int*ap(int x,int y)./*函数体函数体*/表示表示ap 是一个返回指针值的指针型函数,它返回的指是一个返回指针值的指针型函数,它返回的指针指向一个整型变量。针指向一个整型变量。大学计算机大学计算机A(一一)-C语言程序设计语言程序设计 温州大学瓯江学院温州大学瓯江学院 35返回指针值的函数返回指针值的函数(contd)通过指针函数,输入通过指针函数,输入17 之间的整数,输出对应的星之间的整数,输出对应的星期名。期名。#include char*dname(int n)static char*name=Illeg

21、al day,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday;return(n7)?name0:namen);main()int i;printf(Input Day No(1-7):);scanf(%d,&i);if(i%sn,i,dname(i);大学计算机大学计算机A(一一)-C语言程序设计语言程序设计 温州大学瓯江学院温州大学瓯江学院 36函数指针变量和指针型函数函数指针变量和指针型函数如如int(*p)()和和int*p()是两个完全不同的量。是两个完全不同的量。int(*p)()是一个变量说明,说明是一个变量说明,说

22、明p是一个指向函数是一个指向函数入口的指针变量,该函数的返回值是整型量,入口的指针变量,该函数的返回值是整型量,(*p)的两边的括号不能少。的两边的括号不能少。int*p()则不是变量说明而是函数说明,说明则不是变量说明而是函数说明,说明p是一是一个指针型函数,其返回值是一个指向整型量的指个指针型函数,其返回值是一个指向整型量的指针,针,*p两边没有括号。作为函数说明,在括号内两边没有括号。作为函数说明,在括号内最好写入形式参数,这样便于与变量说明区别。最好写入形式参数,这样便于与变量说明区别。对于指针型函数定义,对于指针型函数定义,int*p()只是函数头部分,只是函数头部分,一般还应该有函

23、数体部分。一般还应该有函数体部分。大学计算机大学计算机A(二二)-C语言程序设计语言程序设计 温州大学瓯江学院温州大学瓯江学院 37指针小结指针小结有关指针的数据类型的小结有关指针的数据类型的小结定定 义义含含 义义int i;定义整型变量定义整型变量iint*p;p为指向整型数据的指针变量为指向整型数据的指针变量int an;定义整型数组定义整型数组a,它有,它有n个元素个元素int*pn;指针数组指针数组p,由,由n个指向整型数据的指针元素组成个指向整型数据的指针元素组成int(*p)n;p为指向含为指向含n个元素的一维数组的指针变量个元素的一维数组的指针变量int f();f为带回整型函

24、数值的函数为带回整型函数值的函数int*p();p为带回一个指针的函数,该指针指向整型数据为带回一个指针的函数,该指针指向整型数据int(*p)();p为指向函数的指针,该函数返回一个整型值为指向函数的指针,该函数返回一个整型值int*p;p是一个指针变量,它指向一个指向整型数据的指针变量是一个指针变量,它指向一个指向整型数据的指针变量大学计算机大学计算机A(一一)-C语言程序设计语言程序设计 温州大学瓯江学院温州大学瓯江学院 38指针小结指针小结(contd)指针是指针是C语言的一种构造数据类型,它是语言的一种构造数据类型,它是C语语言的一个特色,使用指针的优点主要有:言的一个特色,使用指针

25、的优点主要有:可以有效地表示复杂的数据结构,如使用指针变量可以有效地表示复杂的数据结构,如使用指针变量可以灵活处理字符串;可以灵活处理字符串;能实现存储空间的动态分配,即可以处理一批长度能实现存储空间的动态分配,即可以处理一批长度不确定的数据或一批动态变化的数据,从而提高程不确定的数据或一批动态变化的数据,从而提高程序执行效率;序执行效率;使用指针变量作为函数参数,可以从函数中返回多使用指针变量作为函数参数,可以从函数中返回多个值;个值;能直接处理内存地址;能直接处理内存地址;大学计算机大学计算机A(一一)-C语言程序设计语言程序设计 温州大学瓯江学院温州大学瓯江学院 39指针小结指针小结(c

26、ontd)但指针的灵活性也使得程序设计过程容易产生但指针的灵活性也使得程序设计过程容易产生一些难以发现的错误,因此使用指针时应当小一些难以发现的错误,因此使用指针时应当小心谨慎,多进行上机实践,在实践中积累经验。心谨慎,多进行上机实践,在实践中积累经验。-40-作业布置作业布置1.抄写崔武子主编教材抄写崔武子主编教材P179-184 例例6.8至例至例6.122.编写编写我我廖雪峰廖雪峰主编教材中的主编教材中的第第76页第页第5题;第题;第7题为题为选作选作题。参考答案请查看第题。参考答案请查看第193页至页至197页。页。预习预习指针和二维数组、指针和函数、指针数组指针和二维数组、指针和函数、指针数组作业作业-41-上机训练例上机训练例6.8例例6.12完成完成ftp:/10.172.250.252:1161下的下的“实实验验16-指针与字符串指针与字符串.doc”上机运行上机运行我廖雪峰主编我廖雪峰主编教材第教材第69页的调试页的调试样例样例上机实验(上机实验(第第15次实验次实验)谢谢 谢谢 观观 看!看!

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

当前位置:首页 > 教育专区 > 大学资料

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

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