《c语言程序设计教学课件》第8章.ppt
(The C Language Programming),C语言程序设计,2,教学目的与要求:掌握程序的基本结构了解C语句概述熟记数据的输入及输出函数的一般格式,并能编写简单的顺序结构程序。教学手段:多媒体课件为主,辅以黑板板书教学内容、重点、难点及作业详见课件,3,第八章 指针,8.3 指针与数组8.4 指针与字符串8.5 指针数组与命令行参数8.6 程序举例,4,8.3 指针与数组,8.3.1 指向一维数组的指针将一个一维数组的起始地址(数组名)赋给一个指针变量,则该指针变量就是一个指向一维数组的指针。例如:int a5=1,2,3,4,5,*p;p=a;或:p=,1,2,3,4,5,a数组,p,a0,a1,a2,a3,a4,5,若有如下定义:int a5=0,2,4,6,8,*p=a;则a数组中第i个元素可用以下4种方法表示:(1)下标法:ai。(2)数组名法:*(a+i)。(3)指针法:*(p+i)。(4)指针下标法:pi。,6,例8.7 使用不同方法输出整型数组a各元素。,main()int a5=1,2,3,4,5,i,*p;for(i=0;i5;i+)printf(%4d,ai);printf(n);for(i=0;i5;i+)printf(%4d,*(a+i);printf(n);for(p=a;pa+5;p+)printf(%4d,*p);printf(n);p=a;for(i=0;i5;i+)printf(%4d,pi);,7,例8.8 从键盘上输入5个整数到数组a中,然后输出。,main()int a5,i,*p;p=a;for(i=0;i5;i+)scanf(%d,p+);p=a;for(i=0;i5;i+)printf(“%6d”,*(p+);/*不可(*p)+*/printf(n);,8,8.3.2 指向二维数组的指针,1.二维数组的地址与一维数组类似,二维数组名代表二维数组的首地址,但该地址是二级地址。如有下面的定义:int a23=1,2,3,4,5,6;对于第0行的元素a00,a01,a02,可以看成是一维数组a0的三个元素,即把a0看成一维数组名,这样a0即代表第0行的首地址,也是第0行第0列元素的地址:&a00。,9,因此,a0,a1 分别代表2行的首地址,而a0又可以表示为*(a+0),a1可表示为*(a+1)。因此元素aij的地址可表示为ai+j或*(a+i)+j。而元素值则表示为*(ai+j)或*(*(a+i)+j)。例如:a02元素可表示为*(a0+2)或*(*(a+0)+2)。这就是二维数组元素的指针表示形式。由此得出二维数组元素的三种表示形式:1、aij(下标法)2、*(ai+j)(一维数组名法)3、*(*(a+i)+j)(二维数组名法)。,10,二维数组的指针表示如图所示:int a34=1,2,3,4,5,6,7,8,9,10,11,12;,11,main()int a23=1,2,3,4,5,6,i,j,k,*p;for(i=0;i2;i+)for(j=0;j3;j+)printf(%4d,*(ai+j);printf(n);for(i=0;i2;i+)for(j=0;j3;j+)printf(%4d,*(*(a+i)+j);printf(n);p=*(a+0);for(i=0;i2;i+)for(j=0;j3;j+)printf(%4d,*(p+);printf(n);,例8.9:,12,2.指向二维数组的指针变量,(1)直接指向二维数组元素的指针变量 例8.10 找出二维数组中的最大元素,并指出其所在的位置(行列号)。main()/*用数组名法实现*/int i,j,m,n,max,a34=1,2,3,4,5,6,7,8,9,10,11,12;max=*a;/*将第一个元素值赋给max*/for(i=0;i3;i+)for(j=0;j4;j+)if(max*(*(a+i)+j)max=*(*(a+i)+j);m=i;n=j;printf(max is:a%d%d=%dn,m,n,max);,13,main()/*用指针法实现*/int i,j,m,n,max,*p;int a34=1,2,3,4,5,6,7,8,9,10,11,12;p=a0;max=*p;/*将第一个元素值赋给max*/for(i=0;i3;i+)for(j=0;j4;j+,p+)if(max*p)max=*p;m=i;n=j;printf(max is:a%d%d=%dn,m,n,max);,14,(2)指向二维数组一行的指针,指向二维数组一行的指针亦称行指针。行指针定义形式为:类型标识符(*指针变量名)元素个数;例如:int a35,(*p)5;p=a;/*或p=a+0;*/由于p是行指针,所以p+1不是指向数组的下一元素a01,而是指向下一行a1。,15,例8.11 用行指针实现例8.10的功能。,main()int i,j,m,n,max,(*p)4;int a34=1,2,3,4,5,6,7,8,9,10,11,12;p=a;max=*(*p+0);/*将第一个元素值赋给max*/for(i=0;i3;i+,p+)for(j=0;j4;j+)if(max*(*p+j)max=*(*p+j);m=i;n=j;printf(max is:a%d%d=%dn,m,n,max);,16,8.3.3 用指向数组的指针作函数参数,用数组名作参数有以下4种情况:(1)实参和形参都是数组名;(2)实参是数组名,形参是指针变量;(3)实参是指针变量,形参是数组名;(4)实参和形参都是指针变量。,17,int fun(int a,int n)/*形参为数组,也可为*a*/int k,sum=0;for(k=0;kn;k+)sum+=ak;/*也可*a+*/return(sum);main()int a34=1,2,3,4,5,6,7,8,9,10,11,12,*p,total;p=a0;total=fun(p,12);/*用指针变量作实参*/printf(“total=%dn”,total);,例8.12 求二维数组中全部元素之和。,18,8.4 指针与字符串,8.4.1 指向字符串的指针指向字符串的指针称为字符指针,其定义形式是:char*指针变量名;例如:char c5=book,*p;p=c;请看下列程序:main()char c=book,*p;p=c;printf(%sn,c);printf(%sn,p);,19,例8.13 将字符串第n个字符开始复制到另一数组中。,#include string.hmain()int i,n;char a=“computer”,b10,*p,*q;p=a;q=b;scanf(%d,输入:3输出:String a:computerString b:mputer,20,8.4.2 字符指针与字符数组的区别,(1)字符数组由若干个元素组成,每个元素可以放一个字符;字符指针是一个存放地址的变量,其值可以是字符串的首地址(指向这个字符串)也可以是字符变量的地址(指向这个字符变量),字符指针的值是可以改变的。(2)赋值方式不同。对于字符数组c可以char c20=computer;但不可以char c20;c=computer;而对于字符指针p,既可以char*p=computer;也可以char*p;p=computer;,21,用字符指针作函数的参数,也有4种情况:(1)实参形参都是字符数组名;(2)实参是字符数组名,形参是字符指针变量;(3)实参是字符指针变量,形参是字符数组名;(4)实参和形参都是字符指针变量。,22,例8.14 编写一个函数str_cat(),使串s2接到串s1后。,char*str_cat(char*s1,char*s2)char*p;for(p=s1;*p!=0;p+);/*此处使用了空循环*/while(*s2!=0)*p+=*s2+;*p=0;return(s1);main()char c110=“abc”,c2=“def”,*p;p=str_cat(c1,c2);printf(The new string is:%sn,p);printf(The new string is:%sn,c1);,运行结果:The new string is:abcdefThe new string is:abcdef,23,8.5 指针数组与命令行参数,8.5.1 指针数组指针数组的定义形式为:类型标识符*数组名常量表达式;例如:char*p3;p0=BASIC;p1=PASCAL;p2=FORTRAN;或:char*p3=BASIC,PASCAL,FORTRAN;,24,8.5.2 指针数组与命令行参数,带形参的main()函数的一般形式是:main(int argc,char*argv)此时其调用格式为:可执行程序名 参数1 参数2 参数n,25,例8.16 设下列程序名为exam.c,经编译连接后生成的可执行程序为exam.exe。请分析程序执行结果。,#include stdio.hmain(int argc,char*argv)int i=0;printf(argc=%dn,argc);while(argc=1)printf(参数%d:%sn,i,*argv);i+;argc-;argv+;若运行该程序时在命令行输入的是:exam BASIC PASCAL FORTRAN,运行结果:argc=4参数0:exam参数1:BASIC参数2:PASCAL参数3:FORTRAN,26,27,课堂练习,写出下面程序的运行结果:1.void fun(int*x)printf(%dn,+*x);main()int a=25;fun(,运行结果:26,28,2、#include stdio.hmain()char*ptr1,*ptr2;ptr1=ptr2=8765;(*ptr1)+;ptr2+;printf(c1=%c,c2=%cn,*ptr1,*ptr2);while(*ptr2!=0)putchar(*ptr2+);putchar(n);,运行结果:C1=9,c2=7765,29,3、main()char*str=abcde;printf(%cn,*str);printf(%cn,*str+);printf(%cn,*+str);printf(%cn,(*str)+);printf(%cn,+*str);,运行结果:aacce,30,4、main()int a=1,2,3,4,5;int x,y,*p;p=,运行结果:*p=1,x=3,y=5,31,小 结,1、掌握用指向数组的指针来访问数组元素;2、掌握行指针的概念及定义方法;3、明确用指向数组的指针作函数参数有4种情况;4、掌握指针数组的定义和使用;5、了解主函数带参数时程序的写法及运行方法。,*,不是结束,是开始,End,*,