●第10章指针-2教学材料

上传人:yuzo****123 文档编号:142483774 上传时间:2020-08-20 格式:PPT 页数:30 大小:515KB
返回 下载 相关 举报
●第10章指针-2教学材料_第1页
第1页 / 共30页
●第10章指针-2教学材料_第2页
第2页 / 共30页
●第10章指针-2教学材料_第3页
第3页 / 共30页
●第10章指针-2教学材料_第4页
第4页 / 共30页
●第10章指针-2教学材料_第5页
第5页 / 共30页
点击查看更多>>
资源描述

《●第10章指针-2教学材料》由会员分享,可在线阅读,更多相关《●第10章指针-2教学材料(30页珍藏版)》请在金锄头文库上搜索。

1、1,第10章指针-2,2,小结:两维数组的指针变量 (一)列指针:指向数组元素的指针。 1.定义:int aNM; int *p,i,j,k; p=*a; /* p每增一,指向下一个元素 */ 2.引用: k=0 ;kN*M ;k+ (1)不分行:引用 *(pk), (2)分行: i=0;iN ;i+ j=0;jM ;j+ 引用 *( piMj ) 就是aij,3,(二)行指针:指向由M个元素组成的一维数组的指针。 1.定义: int aNM; int (*p)M,i,j; p=a; /* p每增一,指向下一行。不能用p=*a; */ 2.引用: *(p+i)+j 就是 void search

2、(float (*p)4,int n); void main() float a34=80,85,76,65,90,88,78,67,56,79,98,65; int n; average(*a); printf(n=?); scanf(%d, ,void average(float *p) float sum=0; /* p列指针 */ float *p_end=p+11,aver; for(;p=p_end;p+) sum=sum+*p; /* p初值*a */ aver=sum/12.0; printf(aver=%.1fn,aver); ,void search(float (*p)4

3、,int n) /* p是行指针 */ int j; printf(The scores of NO.%d:,n); for (j=0;j4;j+) printf(%8.1f,*(*(p+n-1)+j); /* n生在第n-1行 */ printf(n); ,6,例10.15 在上题的基础上,找出一门或一门以上不及格的学生,并输出他们的全部成绩。,分析: 主函数:输入成绩数组初始化 调用函数search() 被调函数search():查找不及格者 用标志变量flag只要一门不及格,令flag=1 实参:数组名-a 形参:行指针(*p)4,7,#include void search(float

4、 (*p)4,int n); void main() float a34=65,57,70,60,58,87,90,81,90,99,97,100; search(a,3);/* 3是人数 */ ,void search(float (*p)4,int n) int i,j,flag; for(i=0;in;i+) flag=0; for(j=0;j4;j+) if(*(*(p+i)+j)60) flag=1; if(flag=1) printf(第%d生不及格,成绩:n,i+1); for(j=0;j4;j+) printf(%6.1f,*(*(p+i)+j); printf(n); ,a,

5、3,8,习题10.9 将一个3X3矩阵转置,即行-列,列-行。,提示:int a33=1,2,3,4,5,6,7,8,9; a01 a02 1 2 3 a10 4 5 6 a12 a20 7 8 9 a21,转置后变成: 1 4 7 2 5 8 3 6 9,i=0-1;i+ j=i+1-2;j+ *(*(p+i)+j) *(*p+j)+i)/* 即aij aji*/,9,#include void main( ) int a33=1,2,3,4,5,6,7,8,9; int (*p)3,i,j,t; p=a; printf(原来的数组是:n); for(i=0;i3;i+) for(j=0;j

6、3;j+) printf(%4d,*(*(p+i)+j); printf(n); for(i=0;i=1;i+) for(j=i+1;j=2;j+) t=*(*(p+i)+j); *(*(p+i)+j)=*(*(p+j)+i); *(*(p+j)+i)=t; ,printf(转换后的数组是:n); for(i=0;i3;i+) for(j=0;j3;j+) printf(%4d,*(*(p+i)+j); printf(n); ,10,10.4指向字符串的指针,有字符串常量,但没有字符串变量,字符串只能用数组表示,那么,字符串的指针也就是指向字符数组的指针。 一.字符串的表示形式 1.用字符数组

7、表示。如: #include void main() char string=I love China!; printf(%sn,string); 2.用指向字符串的指针表示 #include void main() /*字符串本身就代表字符串的首地址*/ char *string=I love China!; /* string是指针变量 */ printf(%sn,string); ,11,说明: (1)char *string=I love China!; 等价于下两行: char *string; /*定义一个指向字符串的指针变量*/ string=I love China!; /*把

8、串的首地址存入string */ 写成: char *string; *string=I love China! 是错误的。 (2)也可以 char a=I am a teacher.; /*定义字符数组*/ char *p; /*定义指针变量*/ p=a; /*数组名即首地址交给指针变量*/,12,(3)输出printf(%s,p); /* p前面不要带* */ 或用puts(p);或用puts(a); 但对数值数组: int a3=1,2,3; printf(%d,a);是错误的。 必须用循环: for (i=0;i=2;i+) printf(%d,ai);,13,例10.18 将字符串a

9、复制到字符串b中。,解1:用地址法。 #include void main() char a=I am a boy.; char b20; /* b数组的长度大一些 */ int i; for(i=0;*(a+i)!=0 ;i+) *(b+i)=*(a+i); *(b+i)=0; /* 最后给串b加尾符 */ printf(The string a: %sn,a); printf(The string b: %sn,b); ,14,解二:用指针法 #include void main() char a=I am a boy.; char b20; char *p1,*p2; p2=b; for

10、(p1=a;*p1!=0;p1+) *p2=*p1; p2+; /* p1增1,p2也跟着增1 */ *p2=0; /*给字符串b加上尾符 */ printf(The string a:%sn,a); printf(The string b:%sn,b); puts(p1-11); /*回到首地址,指向a0或用puts(a) */ puts(p2-11); /*回到首地址,指向b0或用puts(b) */ ,15,二.字符串的指针作为函数的参数 实参 数组名 形参 数组名 指针变量 指针变量,例10.20 将字符串a复制到字符串b中。,解一.形参和实参都用数组名 #include void c

11、opy_string(char from,char to); void main() char a=I am a teacher.; char b=You are a student.; printf(The string a: %s n,a); printf(The string b: %s n,b); copy_string(a,b); printf(The string a: %s n,a); printf(The string b: %s n,b); ,void copy_string(char from,char to) int i; for(i=0;fromi!=0;i+) toi

12、=fromi; toi=0; ,16,#include void copy_string(char *from,char *to); void main() char from=I am a teacher.; char to=You are a student.; char *a=from,*b=to; printf(The string a: %s n,a); printf(The string b: %s n,b); copy_string(a,b); printf(The string a: %s n,a); printf(The string b: %s n,b); ,void co

13、py_string(char *from,char *to) for(;*from!=0;from+) *to=*from; to+; *to=0; ,解二. 形参和实参都用指针变量,17,分析: 主函数:输入串s1-是字符数组s1N 输入m 调用函数:fz(s1,s2,m) 输出串s1和s2 被调函数: void fz(char *p1,char *p2,int m) p1=p1+m-1;*p1!=0;p1+ *p2=*p1; p2+; *p2=0; ,习题10.7 有一个字符串,包含n个字符。写一个函数,将此字符串中从第m个字符开始的全部字符复制成另一个字符串。,18,#include #

14、define N 100 void fz(char *p1,char *p2,int m) ; void main() char s1N,s2N; int m ; printf(Input s1:n); gets(s1); printf(m=?); scanf(%d, ,void fz(char *p1,char *p2,int m) for(p1=p1+m-1;*p1!=0;p1+) *p2=*p1; p2+; *p2=0; ,19,10.5 指向函数的指针变量,主函数调用自定义函数时,首先找到入口地址,调用完返回调用处,即出发点。,内存,主函数,被调函数,4048,入口地址,p,入口地址:

15、被调函数第一条指令的地址。 被调函数的入口地址,叫做函数的指针。 指向函数的指针变量:用以存储函数入口地址的变量。,20,例10.23 输入a,b,输出大者。,解一. 传统方法 int max(int x,int y); void main() int a,b,c; printf(a,b=? ); scanf(%d,%d, ,int max(int x,int y) int x,y; int z; z=xy? x:y; return(z); ,21,解二.用指向函数的指针变量 #include int max(int x,int y); void main() int a,b,c; int (*p)(int,int); /*定义指向函数的指针变量*/ p=max; /*函数名代表函数的入口地址*/ printf(a,b=? ); scanf(%d,%d, ,int max(int x,int y) int z; z=xy? x:y; return(z); ,22,说明: 1.指向函数的指针变量: 定义:类型标识符 (指针变量名)(函数形参表列); 如:int (*p)(int,int); /*形参名可省*/ 指针变量的类型:应与它所指的函数的类型一致。(与函数返回值的类型一致) 2.调用:(

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

当前位置:首页 > 中学教育 > 教学课件 > 高中课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号