模块七 指针应用训练 电子教案(表格式) C语言程序设计(高教版)

资源下载
  1. 二一教育资源

模块七 指针应用训练 电子教案(表格式) C语言程序设计(高教版)

资源简介

第3章 面向对象(上)
模块七 指针应用训练
职业本科规划教材
《C语言程序设计》
教学设计
课程名称: C语言程序设计
授课年级: 2022年级
授课学期: 2022学年第一学期
教师姓名: XXX
2021年10月22日
课题名称 模块七 指针应用训练 计划学时 12学时
内容分析 指针是一种数据类型,它是C语言的重要内容之一。使用指针,可以有效地描述各种复杂的数据结构,能够动态地分配内存空间,能够方便地操作字符串,还可以自由地在函数之间传递各种类型的数据,使程序简介、紧凑,执行效率高。
教学目标及基本要求 (1)理解指针、指针常量的概念。(2)掌握指针变量的定义、运算及内存访问。(3)掌握数组指针、字符串指针及结构体指针的应用。(4)理解指针函数、了解函数指针。
教学重点 指针、指针常量、指针变量、数组指针、字符串指针、结构体指针
教学难点 指针变量、数组指针、字符串指针、结构体指针
教学方式 教学采用教师课堂讲授与学生操作练习共同进行的一体化教学方式概念性知识点:提出为什么,将抽象具体化,配合教学PPT、案例辅助讲解。操作性知识点:提需求,并上机演示如何操作,重点内容总结经验及注意事项。学生操作练习:完成教材中的引例、做中学以及练中学案例,有能力的学生还可以完成教师额外布置的拓展练习题目。
教学过程 第一、二、三学时(指针、指针变量)一、引例任务,提出需求(1)通过引力任务,引出本节所需知识内容。【引例任务】通过一个指针应用程序的简单例子,让读者认识指针变量的定义及应用。【程序代码】#include void main( ){int a,b;int *p1,*p2; /*定义2个整型指针p1,p2*/a=100,b=-100;p1=&a; /*p1指向a*/p2=&b; /*p2指向b*/printf("a变量的值:%d\tb变量的值:%d\n",a,b);printf(" *p1的值:%d\t *p2的值:%d\n",*p1,*p2); /*输出指针变量所指向的值*/}}【程序运行】a变量的值:100 b变量的值:-100 *p1的值:100 *p2的值:-100(2)明确学习方向。【知识点】指针指针变量【能力点】熟练掌握指针变量的定义与访问掌握指针变量的运算理解指针变量作函数参数明确目标,完成任务1. 指针内存是由内存单元组成的,一个内存单元可以存放1B数据,每一个内存单元都有一个内存地址。若在程序中定义变量,C的编译系统在编译时就会给该变量分配一块内存区域,它由若干个内存单元组成,这个区域我们称之为存储单元。变量的值就存放在这块内存区域中,我们常称变量的值为“存储单元的内容”。变量的地址就是所占存储单元的地址(第一个内存单元的地址),也就是指针。指针实质上是有数据类型属性的内存地址。不同数据类型的指针是不一样的,它们指向的存储单元大小上不一样,也就是说所占的内存单元个数不一样。2. 指针变量对一个变量访问,即给变量赋值或者使用变量的值,有直接访问、间接访问两种方式。1)直接访问直接访问是用指针常量进行访问,比如a变量的内存地址是2000,访问变量a的值,只要找到变量a的内存地址2000,从a的存储单元中取出a的值就可以了,这里的2000就是指针常量。2)间接访问间接访问就是借助指针对内存单元的访问。间接访问中,将变量的地址(指针常量)存放在一个专门存放地址的特殊变量——指针变量中。对该指针变量进行访问时,实际访问的是对应的变量的地址。然后才可以根据这个地址,再去取相应的数据变量的值。我们将变量的地址称为指针常量,而存放指针常量的变量称为指针变量。可以这样来理解指针、指针常量和指针变量之间的关系。(1) 指针是一种特殊的数据类型,用来指向存放数据的内存单元。指针有指针常量,指针变量两种,指针常量的值由编译系统确定,是变量的内存地址。(2) 指针变量是一种变量,这种变量中存放的数据为指针型的数据,即内存地址。可以把变量的内存地址(即指针常量)赋给指针变量。(3) 指针变量与其所指向的变量之间的关系是指向关系。3. 定义指针变量指针变量是有数据类型属性的变量。指针变量在使用之前必须对它进行定义,定义指针变量的一般格式为:类型说明符 *指针变量名4. 指针变量的赋值指针变量同普通变量一样,使用之前不仅要定义说明,而且必须赋给具体的值。未经赋值的指针变量不能使用,否则将造成系统混乱,甚至死机。指针变量的值只能是地址,决不能赋给任何其它数据,否则将引起错误。C语言中提供了地址运算符“&”来取变量的地址,其语法格式为:&变量名;5. 指针变量的运算指针变量可以进行某些运算,但其运算的种类是有限的。它只能进行赋值运算和部分算术运算及关系运算。1)指针变量独有的运算符指针变量独有的运算符有两个:“&”和“*”。(1) 取地址运算符“&”。例如:&a含义为取变量a的地址。(2) 指针运算符“*”(也称“间接访问”运算符、取值运算符)。例如:*p的含义是引用指针变量p所指向的存储单元(变量)的值。(3) 运算符“&”和“*”的优先级相同,结合性均为自右向左。2)赋值运算指针变量的赋值运算有以下几种形式:把一个变量的地址赋给与它数据类型相同的指针变量。(2) 把一个指针变量的值赋给相同数据类型的另一个指针变量。(3) 把数组的首地址赋给指向数组的指针变量。(4) 把字符串的首地址赋给指向字符类型的指针变量。3)加减整数运算对于指向数组的指针变量,可以加上或减去一个整数n。设p是指向数组a的指针变量,则:p+n、p-n、p++,p--、++p、--p都是合法的。4)指针变量间的算术运算指向数组单元的两指针变量之间可以进行减法运算,运算结果为整型数据,表示两指针变量所指数组元素之间的数组元素个数。5)指针变量间的关系运算指向同一数组的两指针变量进行关系运算可表示它们所指数组元素之间的前后存储位置关系。6)空指针当指针p被赋值为NULL时,p就是空指针,表示p不指向任何数据。在头文件stdio.h中,NULL被定义为0。习惯上不使用p=0; ,而使用p=NULL;。但指针变量p可以与NULL作比较。指针变量作函数参数函数的参数可以为整型、字符型等数据,也可以为指针类型数据。当指针变量作为函数的参数时,其作用为将一个变量的地址传送到函数中。【做中学7-1】将输入的两个整数按从大到小的顺序输出。【程序代码】#include void swap(int *p1,int *p2){ int temp; temp=*p1;*p1=*p2;*p2=temp;}void main( ){ int a,b,*pa,*pb; printf("\n输入两整数:\n"); scanf("%d,%d",&a,&b); /*用户输入两个数,分别给a,b*/ pa=&a; /*将a的地址赋给指针变量pa*/ pb=&b; /*将b的地址赋给指针变量pb*/ if (a#define N 4void main( ){ int a[N], *p,i; p=a; printf("请给一个数组a[%d]赋值:\n",N); for (i=0;ivoid paixu(int u[N],int v[N]);void main( ){ int i,a[N],b[N],*pa,*pb; pa=&a[0];pb=&b[0]; for(i=0;ivoid paixu(int *x,int *y);void main( ){ int i,a[N],b[N],*pa,*pb; pa=&a[0];pb=&b[0]; for(i=0;i#define N 5struct stu{ char name[30]; float score[3];}stu1[N];void main( ){ struct stu *p=stu1; int i,j; float aver[3]={0}; printf("\n请输入考生姓名及三门课的成绩:\n"); for (i=0;iname,&(p+i)->score[0]); scanf(" %f %f",&(p+i)->score[1],&(p+i)->score[2]); } for (i=0;i<3;i++){ /*计算每科的总成绩*/ for (j=0;jscore[i];/*累计结构体数组元素中的成员数组元素值*/ } printf("平均成绩:\n第一科:%3.1f ",aver[0]/N); printf("第二科:%3.1f 第三科:%3.1f\n",aver[1]/N,aver[2]/N);}1.指向结构体变量的指针定义了结构体类型之后,可以定义结构体变量,也可以定义指向结构体变量的指针共有3种引用结构体成员变量的格式:(1) 结构体变量.成员名,例如stu1.name。(2) (*指针变量) .成员名,例如(*p).name。(3) 指针变量->成员名,例如p->name。2.指向结构体数组的指针一个指针变量可以指向一个结构体数组,也就是可以将该数组的起始地址赋给此指针变量。【做中学7-6】利用字符指针实现字符串。【程序代码】#include void main( ){ char *zf="我来自中国!"; printf("%s\n",zf);}【做中学7-7】利用指针实现字符串a到字符串b的复制。【程序代码】#include void main( ){ char a[]="I am happy"; char b[20],*pa,*pb; for(pa=a,pb=b;*pa!='\0';pa++,pb++) *pb=*pa; *pb='\0'; /*为数组b添加一个字符串结束符‘\0’*/ printf("\n字符串a:%s",a); printf("\n字符串b:"); for(pb=b;*pb!='\0';pb++) printf("%c",*pb);} 三、归纳总结,布置课后作业 (1)回顾上课前的学习目标,对本节课知识点进行总结.(2)扫描二维码查看相应资源,完成课后作业。第九、十学时(函数与指针)引例任务,提出需求(1)回顾上节课的内容,结构体指针、字符串指针。(2)明确本节课学习方向。【知识点】指针函数函数指针【能力点】理解指针函数了解函数指针二、明确目标,完成任务1. 返回指针值的指针函数函数类型是指函数返回值的数据类型。在C语言中允许一个函数的返回值的数据类型是整型、字符型、实型等数据类型,也可以是指针数据类型。这种返回指针数据类型的函数称为指针型函数。定义指针型函数的语法格式为: 类型说明符 *函数名(形参表) { …… /*函数体*/ }【做中学7-8】键盘输入三个数,求三个数中的最大值。【程序代码】#include float *max(float *x,float *y,float *z){ float max,*p; max=*x,p=x; if (max<*y) {p=y;max=*y;} if (max<*z) p=z; return p;}void main( ){ float a,b,c,*p; printf("请输入三个数据:"); scanf("%f,%f,%f",&a,&b,&c); p=max(&a,&b,&c); printf("最大值:%5.2f\n",*p);}函数的指针及指向函数的指针变量C语言中的指针,既可以指向变量,也可以指向函数。C语言中,一个函数占用一段连续的内存区,函数名就是该函数所占内存区的首地址。可以把函数的首地址赋予一个指针变量,使指针变量指向函数,然后通过指针变量就可以找到并调用这个函数。把这种指向函数的指针变量称为函数指针变量。1)函数指针变量的定义与使用函数指针变量定义的语法格式为:类型说明符 (*指针变量名) (形参表列);类型说明符表示被指函数的返回值的类型。“*”后面的变量是定义的指针变量,最后的圆括号表示指针变量所指的是一个函数。2)通过函数指针来调用函数【做中学7-9】求两个数的最大数。【程序代码】#include int max(int x,int y);void main( ){ int a,b,c; int (*pf)(int,int); pf=max; scanf("%d,%d",&a,&b); c=(*pf)(a,b); printf("a=%d,b=%d\nmax=%d\n",a,b,c);}int max(int x,int y){ return x>y x:y;}〖程序运行〗输入两个数据:34,78↙ a=34,b=78max=78指向函数的指针变量pf,像pf++、pf--、pf+ n等运算是无意义的。三、归纳总结,布置课后作业 (1)回顾上课前的学习目标,对本节课知识点进行总结.(2)扫描二维码查看相应资源,完成课后作业。第十一、十二学时(边学边练、实训题)一、上机练习【能力点】掌握指针变量的定义及初始化;掌握数组指针的使用;掌握字符指针的使用;理解函数指针的使用。【练中学7-1】 编写一字符串拷贝函数。【程序代码】#define N 12#include "stdio.h"void strcopy(char *s,char *t){ for(;*s!='\0';s++,t++) *t=*s; *t='\0'; //字符指针代表是整个字符串,字符指针的间接访问代表的是字符}void main( ){ char source[N]="operation",detination[N]; printf("源串:%s\n",source); strcopy(source,detination); printf("目的串:%s\n",detination);}【练中学7-2】 顺序查找指针数组中的字符串。【程序代码】#include#includechar *week_day[8]={"sunday","monday","tuesday","wednesday", "thursday","friday","saturday",NULL};/*说明指针数组。数组中的每个元素指向一个字符串*/ int lookup(char *ch);void main( ){ int l;char string[20]; printf("输入一个表示星期的字符串(如sunday):"); scanf("%s",string); l=lookup(string); printf("这是数组中的%d个元素\n",l);}int lookup(char *ch){ /*传递字符串(字符数组)*/ int i; for(i=0;week_day[i]!=NULL;i++){ /*开始查找工作*/ if (!strcmp(week_day[i],ch)) return(i); /*若找到则返回对应的序号*/ } /*完成查找工作*/ return(-1);}【练中学7-3】编程实现求几个数学函数定积分的程序。【程序代码】#include double f1(double x){ double f; f=1+x*x; return f;}double f2(double x){ double f; f=1+x+x*x+x*x*x; return f;}double f3(double x){ double f; f=x/(1+x*x); return f;}double integral(double(*fun)(double),double a,double b){ double s,h,y; long n,i; s=((*fun)(a)+(*fun)(b))/2; n=1000000; h=(b-a)/n; for (i=1;i教学后记
2

展开更多......

收起↑

资源预览