1、湖南安全技术职业学院备课纸授课班级 信安 0801 班 信安 0801 班授课时间 月 日 月 日 月 日 月 日 11 月 28 日星 期 星期一 星期二 星期三 星期四 星期五授课地点 多媒体 多媒体 多媒体 多媒体 多媒体第18课教案课题内容指针:地址与指针变量的概念,地址运算符与间址运算符,一维、二维数组和字符串的地址以及指向变量、数组、字符串、函数、结构体的指针变量的定义,通过指针引用以上各类型数据。教学目的理解、掌握地址与指针变量的概念,地址运算符与间址运算符,一维、二维数组和字符串的地址以及指向变量、数组、字符串、函数、结构体的指针变量的定义,通过指针引用以上各类型数据教学方法讲
2、授法重点一维、二维数组和字符串的地址以及指向变量、数组、字符串、函数、结构体的指针变量的定义,通过指针引用以上各类型数据难点一维、二维数组和字符串的地址以及指向变量、数组、字符串、函数、结构体的指针变量的定义,通过指针引用以上各类型数据能力培养掌握地址与指针变量的概念,地址运算符与间址运算符,一维、二维数组和字符串的地址以及指向变量、数组、字符串、函数、结构体的指针变量的定义,通过指针引用以上各类型数据课堂类型新授课教具 投影仪作业 课件实例操作湖南安全技术职业学院备课纸第一节 指针9.1 指针概述指针是 C 语言的重要数据类型,同时,也是 C 语言的一个重要特点;掌握好了指针也就掌握了 C
3、语言的精华部分。C 语言的高度灵活性及极强的表达能力,在很大程度是依赖于恰当使用指针而实现的。正确的使用指针可以有效的表示复杂的数据结构,实现动态内存分配,更灵活的使用字符串、数组,能改变函数实参,提高函数的运行效率等。但是,由于指针概念比较复杂,使用灵活,初学者会感觉比较困难。所以初学者在学习过程中一定要深入思考,多上机调试程序。同时要从实用性的角度去理解指针的重要性,它是一个非常有趣的知识点。9.2 指针与指针变量9.2.1 指针的概念由于数据是在内存中进行存储的,当程序中定义了一个变量后,在编译时系统就会给这个变量分配内存单元;系统根据程序中定义的变量的数据类型,分配一定长度的空间。内存
4、区的每一个字节有一个编号,这个编号就是“地址” ,这个地址所志的内存单元就存放着数据。直接存取:直接按变量名或地址来存取变量的方式。其实,按照变量名来访问内存,实际上仍是通过地址来访问的。地址就像是要访问的存储单元的指示标。间接存取:用存储在一个变量中的地址去访问这个地址所标志的内存单元的方式。专门用来存储另外一个变量地址的变量称为“指针变量” 。9.2.2 指针变量的定义指针变量的定义需要指出指针变量的数据类型和指针变量名,它的一般说明形式:数据类型 *指针变量名;第一:*是一个说明符,*后面是指针变量的变量名。第二:一个指针变量只能指向同一类数据类型的数据。湖南安全技术职业学院备课纸指针变
5、量与变量一样,具有三要素:变量类型、变量名和变量值。而指针变量存放的是所指向的某个变量的地址值,而普通的变量保存的是该变量本身的值,这也是指针变量与普通变量的显著差别。实例:在指针变量定义的同时,也可给它赋初值,这称为指针变量的初始化。#include “stdio.h“#include “string.h“#include “conio.h“void main()int a=10;int *pi=clrscr();printf(“a=%dn“,a);printf(“*pi=%dn“,*pi);getch();运行结果:a=10*pi=109.3 指针运算指针运算有三种类型:赋值运算、算术运算
6、和关系运算。9.3.1 指针变量赋值运算实例:把一个变量的地址赋值给指针变量。#include “stdio.h“#include “string.h“#include “conio.h“湖南安全技术职业学院备课纸void main()int a,b;int *pa,*pb;char *pc;a=100;b=200;pa=pb=clrscr();printf(“*pa=%d,*pb=%dn“,*pa,*pb);pa=pb;printf(“*pa=%d,*pb=%dn“,*pa,*pb);getch();运行结果:*pa=100,*pb=200*pa=200,*pb=200下面通过图示进行说明:
7、 a pa b pb pa int *pa;a=100;pa=clrscr();printf(“*(+pa)=200;printf(“pa=%p,*pa=%dn“,pa,*pa);pa=pa+1;*pa=300;printf(“pa=%p,*pa=%dn“,pa,*pa);getch();运行结果:int *pa,*pb;a=100;b=200;pa=pb=clrscr();if(pa=pb)printf(“*pa=%dn“,*pa);elseprintf(“*pb=%dn“,*pb);printf(“pa=%p,pb=%pn“,pa,pb);getch();运行结果:*pb=200pa=FF
8、D8,pb=FFDA湖南安全技术职业学院备课纸9.3.3 多级指针在 C 语言中,除了允许指针指向普通数据外,还允许指针指向另外的指针,这种指针就叫做多级指针;当一个指针指向普通数据时,这样的指针叫做一级指针;而指向一级指针的指针就叫做二级指针。指向二级指针的指针叫做三级指针,依此类推。在现实生活中最多用到二级指针就可以了。二级指针的定义:数据类型 *指针变量实例:二级指针的运用。#include “stdio.h“#include “string.h“#include “conio.h“void main()int a=100;int *pa,*ppa;pa=ppa=clrscr();pri
9、ntf(“a=%d,*pa=%d,*ppa=%dn“,a,*pa,*ppa);getch();运行结果:a=100,*pa=100,*ppa=100通过如下图所示,就可得到说明。 ppa elseprintf(“max:%dn“,*j);void main()int i=100,j=200;int *pi,*pj;pi=pj=clrscr();max(max(pi,pj);getch();湖南安全技术职业学院备课纸运行结果:max:200max:2009.4.2 参数的传递方式实例:通过数据复制方式实现数据交换。#include “stdio.h“#include “string.h“#inc
10、lude “conio.h“void swap(int x,int y)int temp;temp=x;x=y;y=temp;void main()int a=100,b=200;clrscr();swap(a,b);printf(“a=%d,b=%d“,a,b);getch();运行结果:a=100,b=200湖南安全技术职业学院备课纸说明:在这种方式中,传递参数就是把数据本身作为实参传递给形参,被调用函数运行完毕后,并不会把形参的结果返回给实参。函数调用时,程序把 a、b 的值100、200 传递给 x、y,在 swap()函数中 x,y 交换之后,没有把它们的结果返回给实参a,b,所以
11、a,b 并没有交换,交换的只有 x,y。a 与 x, b 与 y 占用的是不同的内存单元。也就是说数据复制方式传递数据时,由于 数据在传递方和被传递方中所占用不同的内存空间 ,所以被调用函数中的变量不管怎么变化,都不会影响到调用函数中的实参的值。这就是该程序中两个数没有交换的根本原因。实例:通过地址传递方式实现数据交换。#include “stdio.h“#include “string.h“#include “conio.h“void swap(int *x,int *y)int temp;temp=*x;*x=*y;*y=temp;void main()int a=100,b=200;cl
12、rscr();swap(printf(“a=%d,b=%d“,a,b);getch();湖南安全技术职业学院备课纸运行结果:a=200,b=100说明:在地址传递方式中,传递的不是数据本身,而存储该数据的地址。在调用swap(void main()int a,b,*p;clrscr();scanf(“%d,%d“,p=max(湖南安全技术职业学院备课纸printf(“max=%d“,*p);运行结果:65,45max=65说明:接收函数返回值的变量类型必须与该函数的类型相同。语句p=max(中是采用变量地址传递,也可以先定义两个指针变量,再把指针变量作为实参进行传递。湖南安全技术职业学院备课纸
13、授课班级 信安 0801 班 信安 0801 班授课时间 月 日 月 日 月 日 月 日 12 月 5 日星 期 星期一 星期二 星期三 星期四 星期五授课地点 多媒体 多媒体 多媒体 多媒体 多媒体第20课教案课题内容指针:用指针作函数参数,返回地址值的函数,指针数组,指向指针的指针。教学目的理解、掌握用指针作函数参数,返回地址值的函数,指针数组,指向指针的指针教学方法讲授法重点 用指针作函数参数,返回地址值的函数,指针数组,指向指针的指针难点 用指针作函数参数,返回地址值的函数,指针数组,指向指针的指针能力培养掌握用指针作函数参数,返回地址值的函数,指针数组,指向指针的指针课堂类型新授课教
14、具 投影仪作业 课件实例操作湖南安全技术职业学院备课纸第三节 指针9.4.4 指向函数的指针C 语言中,指针变量除了可以指向整型、字符型、浮点型和结构型等变量外,还可以指向函数的入口地址。当指针指向了函数的入口地址后,它就指向了该函数。一般地,函数名本身就代表了函数的入口地址;所以,就把这种指向函数入口地址的指针称为函数指针。函数指针的定义如下:类型标识符 (*函数指针名)();其中,类型标识符是指针所指向的函数的返回值的数据类型。函数指针名两边的“( )”不能省略,否则,就变成指针型函数了。实例:用函数指针比较两个数大小,并将大者输出。#include “stdio.h“#include “
15、conio.h“int max(int i,int j)return(ij?i:j);void main()int (*fun)(int,int); int a,b,p;clrscr();fun=max;湖南安全技术职业学院备课纸scanf(“%d,%d“,p=(*fun)(a,b);printf(“max=%d“,p);运行结果:56,89max=89说明:这表示 fun 指向返回值类型为 int 的函数,它与 int *fun()是不同的。前者中,fun 是一个指针变量,指向函数的入口地址,后乾中的 fun 是一个函数名,返回类型是 int 型。许多初学者在此经常混淆,这里的格式是值得注意
16、的地方。定义了函数指针之后,可以通过它间接调用所指向的函数,像其它的变量一样,函数指针也要赋以地址值,让它指向一函数的入口地址,这样该指针才能被引用。同时,这个被指向的函数,也可以通过该函数指针间接来调用。另外要说明的几点:第一:(*fun)(int,int)表示定义了一个能指向函数的指针变量,但是没有确定具体指向那一个,它可以指向任何相同类型的函数。只有当 fun=max 语句执行后,指针 fun才真正指向函数 max()。第二:用指针的方式调用函数与用函数名调用函数,效果是一样的。本来函数名就是一个地址。所以 p=(*fun)(a,b)语句与 p=max(a,b)语句是等价的。第三:给函数
17、指针赋值时,只要给出函数名就可以了。不能写成 fun=max(a,b)的形式,这样表示 fun 接收的是函数 max 的返回值,而不是它的地址。一般情况下,函数指针主要用在以下两种情况:一是用函数指针选择性的调用函数;二是用函数指针作函数参数。湖南安全技术职业学院备课纸其实,指向函数的指针与一般的指针本质上没有什么差别,都是保存某内存单元的地址。只是指向函数的指针保存的是函数的入口地址,而一般指针保存的是一般变量的地址。正是因为函数指针保存的是函数的入口地址,而函数的调用本来就是通过对这个入口地址的调用来实现的,所以函数指针就能实现调用函数的功能。而且函数指针可以指向不同的函数(类型要相同 )
18、的入口地址,所以同一个函数指针在同一段程序中往往又能够调用不同的函数,以实现不同的功能。正是这种高度灵活性,使指针的使用就非常困难,同学们在运用指针时要思考该指针是否应该使用,以免使用不当带来很多错误。9.5 指针与数组C 语言中,指针可以指向变量,数组是相同类型数据元素的集合,因此指针也可以指向数组和数组元素。由于数组在内存中各元素是连续存放的,因此利用指向数组或数组元素的指针变量来使用数组,将会更加灵活。数组与指针在访问内存时是采用统一编址的计算方法,所以在有些场合下指针和数组的表现形式具有相同的意义。9.5.1 指向一维数组的指针及操作由数组名是个常量指针,不能再赋值,因而也不能进行像
19、a+和 a等这样的计算。9.5.2 数组名与函数参数数组名可以作为函数的参数,同时数组名也是一种指针,与指针作函数参数一样,数组作函数参数时,传递的时候不是按复制方式传递数据,而是传递地址,即数组的首地址。实例:从键盘输入 6 个整数,找出其中的最大数(通过函数实现) ,并输出。#include “stdio.h“#include “conio.h“#include “math.h“int max1(int a)int i,max; max=a0; for(i=0;imax) max=ai;return max;int max2(int *a) int i,max,*p; p=a;max=*p;湖南安全技术职业学院备课纸for(;pmax) max=*p;return max;void main()int i,max,a6;clrscr();for(i=0;itc164 cd gf yu(输入)得到的结果:The parameter count=4Command name:E:CTESTTC164.EXENo. 1 Parameter:cdNo. 2 Parameter:gfNo. 3 Parameter:yu要实现每个参数所具有的功能,则需要将参数所应的函数关联起来,否则容易出现一些异常现象,感兴趣的同学可以参考 C 语言核心函数大全及相关资料。