数据结构电子教案指针.ppt

上传人:创****公 文档编号:16864341 上传时间:2022-05-19 格式:PPT 页数:22 大小:1.03MB
返回 下载 相关 举报
数据结构电子教案指针.ppt_第1页
第1页 / 共22页
数据结构电子教案指针.ppt_第2页
第2页 / 共22页
点击查看更多>>
资源描述

《数据结构电子教案指针.ppt》由会员分享,可在线阅读,更多相关《数据结构电子教案指针.ppt(22页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、 8.1 指针简介指针简介 8.2 指针变量的操作指针变量的操作 8.3 数组与指针数组与指针 8.4 二维数组与指针二维数组与指针本章小结本章小结本章练习本章练习 第第8章章 指针指针指针极大地丰富了语言的功能,学习指针是学习语言中最重要的一环,能否正确理解和使用指针是我们是否掌握好语言的一个标志。指针是语言中广泛使用的一种数据类型。 运用指针编程是语言最主要的风格之一。利用指针变量可以表示各种数据结构,能很方便地使用数组和字符串,并能象汇编语言一样处理内存地址,从而编出精练而高效的程序。 8.1 指针简介指针简介 1指针的基本概念指针的基本概念 在计算机中,所有的数据都是存放在存储器中的。

2、一在计算机中,所有的数据都是存放在存储器中的。一般把存储器中的一个字节称为一个内存单元,不同的般把存储器中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数不等,如整型量占数据类型所占用的内存单元数不等,如整型量占2个单个单元,字符型占元,字符型占1个单元等,在第个单元等,在第2章中已有详细的介绍。章中已有详细的介绍。为了正确地访问这些内存单元,必须为每个内存单元为了正确地访问这些内存单元,必须为每个内存单元编上号,根据一个内存单元的编号即可准确地找到该编上号,根据一个内存单元的编号即可准确地找到该内存单元,内存单元的编号也叫做内存单元,内存单元的编号也叫做地址地址。既然根据内。既然

3、根据内存单元的编号或地址就可以找到所需的内存单元,所存单元的编号或地址就可以找到所需的内存单元,所以通常也把这个地址称为以通常也把这个地址称为指针指针。内存单元的指针和内。内存单元的指针和内存单元的内容是两个不同的概念,存单元的内容是两个不同的概念, 100010Px1000 2指针变量的类型说明指针变量的类型说明指针变量定义的一般形式为:指针变量定义的一般形式为: 类型说明符类型说明符 *变量名;变量名;其中,其中,“*”表示这是一个指针变量,变量名即为定义的指针表示这是一个指针变量,变量名即为定义的指针变量名,类型说明符表示本指针变量所指向的变量的数据类变量名,类型说明符表示本指针变量所指

4、向的变量的数据类型,即指针变量的基类型。型,即指针变量的基类型。下面对指针变量作几点说明:下面对指针变量作几点说明:(1)指针变量名前的)指针变量名前的“*”表示该变量为指针变量,而指针变表示该变量为指针变量,而指针变量名不包含该量名不包含该“*”。 (2)一个指针变量只能指向同一类型的变量。)一个指针变量只能指向同一类型的变量。 (3)指针变量中只能存放地址,而不能将数值型数据赋给指)指针变量中只能存放地址,而不能将数值型数据赋给指针变量。针变量。 (4)只有当指针变量中具有确定地址后才能被引用。)只有当指针变量中具有确定地址后才能被引用。 (5)与一般的变量一样,也可以对指针变量进行初始化

5、。)与一般的变量一样,也可以对指针变量进行初始化。 例如:例如: int *p1; 表示表示p1是指向整型变量的指针变量是指向整型变量的指针变量 8.2 指针变量的操作指针变量的操作指针变量可以指向任何一种数据类型,例如可以指向基本类指针变量可以指向任何一种数据类型,例如可以指向基本类型的变量,也可以指向数组、结构体、共用体以及另外的指型的变量,也可以指向数组、结构体、共用体以及另外的指针等。指针变量同普通变量一样,使用前需要定义、赋初值,针等。指针变量同普通变量一样,使用前需要定义、赋初值,通过指针还可以引用存储单元,指针指向不同的变量类型其通过指针还可以引用存储单元,指针指向不同的变量类型

6、其操作方法也有所不同。操作方法也有所不同。8.2.1 指针变量的赋值指针变量的赋值指针变量同普通变量一样,使用之前不仅要定义说明,而且指针变量同普通变量一样,使用之前不仅要定义说明,而且必须赋予具体的值。指针变量的赋值只能赋予地址,必须赋予具体的值。指针变量的赋值只能赋予地址, 决不能决不能赋予任何其它数据,否则将引起错误。赋予任何其它数据,否则将引起错误。在语言中,变量的地址是由编译系统分配的,用户不知道在语言中,变量的地址是由编译系统分配的,用户不知道变量的具体地址。语言中提供了地址运算符变量的具体地址。语言中提供了地址运算符&来表示变量来表示变量的地址。的地址。1给指针变量赋地址给指针变

7、量赋地址一般形式为:一般形式为: &变量名;变量名;如如&a变示变量变示变量a的地址,的地址,&b表示变量表示变量b的地址,变量的地址,变量a、b必须预先说明。设有指向整型变量的指针变量必须预先说明。设有指向整型变量的指针变量p,如要,如要把整型变量把整型变量a 的地址赋予的地址赋予p可以有以下两种方式:可以有以下两种方式:(1)指针变量初始化的方法指针变量初始化的方法 :int a;int *p=&a;(2)赋值语句的方法赋值语句的方法 :int a,*p;p=&a;2给指针变量赋给指针变量赋“空空”值值 p= NULL; 或或 p=0; 或或 p=0; 这时,指针这时,指针p并不是指向地址

8、为并不是指向地址为0的存储单元,而是具有的存储单元,而是具有一个确定的值一个确定的值“空空”。 8.2.2 指针变量的运算指针变量的运算指针变量可以进行某些运算,但其运算的种类是有限的,指针变量可以进行某些运算,但其运算的种类是有限的,它只能进行赋值运算和部分算术运算及关系运算。它只能进行赋值运算和部分算术运算及关系运算。1. 指针运算符指针运算符(1) 取地址运算符(取地址运算符(&)取地址运算符取地址运算符“&”是单目运算符,其结合性为自右至左,是单目运算符,其结合性为自右至左,其功能是取变量的地址。在其功能是取变量的地址。在scanf函数及前面介绍指针变量函数及前面介绍指针变量赋值中,我

9、们已经了解并使用了赋值中,我们已经了解并使用了“&”运算符。运算符。(2)取内容运算符(取内容运算符(*)取内容运算符取内容运算符“*”是单目运算符,其结合性为自右至左,是单目运算符,其结合性为自右至左,用来表示指针变量所指的存储单元中的值。用来表示指针变量所指的存储单元中的值。 例例8.1 通过指针输出变量的值通过指针输出变量的值void main() int a=5,*p=&a; printf (a=%d,*p); getch();程序演示程序演示 2. 指针变量的运算指针变量的运算(1) 赋值运算赋值运算指针变量的赋值运算有以下几种形式:指针变量的赋值运算有以下几种形式: 指针变量初始化

10、赋值,指针变量初始化赋值,int a, *pa=&a; 把一个变量的地址赋予指向相同数据类型的指针变量。把一个变量的地址赋予指向相同数据类型的指针变量。int a,*pa; pa=&a; /* 把变量把变量a的地址赋予整型指针变量的地址赋予整型指针变量pa */ 把一个指针变量的值赋予指向相同类型变量的另一个指针把一个指针变量的值赋予指向相同类型变量的另一个指针变量。如:变量。如:int a,*pa=&a,*pb; pb=pa; /* 把把a的地址赋予指针变量的地址赋予指针变量pb,pa、pb指向同一个存储单元指向同一个存储单元 */ pa,pb均为指向整型变量的指针变量,可以相互赋值。均为指

11、向整型变量的指针变量,可以相互赋值。 把数组的首地址赋予指针变量。把数组的首地址赋予指针变量。例如:例如: int a5,*pa; pa=a; 把字符串的首地址赋予指向字符类型的指针变量。把字符串的首地址赋予指向字符类型的指针变量。例如:例如: char *pc; pc=CHINA;(2) 指针变量移动(加减一个整数)指针变量移动(加减一个整数)对于指向连续的存储单元的指针变量,可以加上或减去一对于指向连续的存储单元的指针变量,可以加上或减去一个整数个整数n(运算后的值不要超出连续的存储单元的范围,否(运算后的值不要超出连续的存储单元的范围,否则没有意义)。设则没有意义)。设pa是指向数组是指

12、向数组a的指针变量,则的指针变量,则pa+n,pa-n,pa+,+pa,pa-,-pa 运算都是合法的。运算都是合法的。指针变量加或减一个整数指针变量加或减一个整数n的意义是,把指针指向的当前位的意义是,把指针指向的当前位置向前或向后移动置向前或向后移动n个位置。应该注意,数组指针变量向前个位置。应该注意,数组指针变量向前或向后移动一个位置和地址加或向后移动一个位置和地址加1或减或减1 在概念上是不同的。在概念上是不同的。因为数组可以有不同的类型,各种类型的数组元素所占的因为数组可以有不同的类型,各种类型的数组元素所占的字节长度是不同的。如指针变量加字节长度是不同的。如指针变量加1,即向后移动

13、,即向后移动1 个位置,个位置,表示指针变量指向下一个数据元素的首地址,而不是地址表示指针变量指向下一个数据元素的首地址,而不是地址值加值加1。例如:例如:int a5,*pa=a;pa=pa+2; /* pa指向指向数组元素数组元素a2,即,即pa的值为的值为&a2 */ (3) 两个指针变量之间的运算只有指向同一连续存储单元的两个指针变量之间才能进行, 否则运算毫无意义。以指向数组元素的指针为例: 两指针变量相减两个指针变量相减所得之差是两个指针所指数组元素之间相差的元素个数。实际上是两个指针值(地址) 相减之差再除以该数组元素的长度(字节数)。例如:float b10,*pf1,*pf2

14、; 设pf1和pf2 是指向同一浮点数组b的两个指针变量, pf1的值为2010H,pf2的值为2000H,而浮点数组每个元素占4个字节,所以pf1-pf2的结果为(2010H-2000H)/4=4,表示pf1和 pf2之间相差4个元素,即pf1-pf2=4。两个指针变量不能进行加法运算。 两指针变量进行关系运算指向同一连续存储单元的两指针变量进行关系运算可表示它们所指数组元素之间的关系。例例8.2 指针应用:通过指针求两个数的和与积。指针应用:通过指针求两个数的和与积。void main()int a=10,b=20,s,t,*pa,*pb; /* pa,pb为整型指针变量为整型指针变量*/

15、pa=&a; /* pa指向变量指向变量a */pb=&b; /* pb指向变量指向变量b */s=*pa+*pb; /*求求a+b之和,之和,(*pa就是就是a,*pb就是就是b)*/t=*pa*pb; /*求求a*b之积之积*/printf(a=%d b=%d a+b=%d a*b=%dn,a,b,a+b,a*b);printf(s=%d t=%dn,s,t);getch();程序演示程序演示8.3 数组与指针数组与指针 一个变量对应一个起始地址,一个数组包含若干个数组元素,一个变量对应一个起始地址,一个数组包含若干个数组元素,这若干个数组元素在内存中占用的存储单元的地址是连续的。这若干个

16、数组元素在内存中占用的存储单元的地址是连续的。引用数组元素可以用下标法(如引用数组元素可以用下标法(如a1),也可以用指针法,),也可以用指针法,即通过指向数组元素的指针引用数组元素,使用指针法能使即通过指向数组元素的指针引用数组元素,使用指针法能使目标程序质量更高(占内存少,运行速度快)。目标程序质量更高(占内存少,运行速度快)。8.3.1 一维数组与指针一维数组与指针引入指针变量后,就可以用两种方法来访问数组元素了。引入指针变量后,就可以用两种方法来访问数组元素了。第一种方法为下标法,即用第一种方法为下标法,即用ai形式访问数组元素,在第形式访问数组元素,在第6章章中介绍数组时都是采用这种

17、方法。中介绍数组时都是采用这种方法。第二种方法为指针法,即采用第二种方法为指针法,即采用*(p+i)形式,用间接访问的方形式,用间接访问的方法来访问数组元素。法来访问数组元素。例例8.3 通过指针引用数组元素通过指针引用数组元素void main() int a5,i,*pa; pa=a; /* pa指向数组指向数组a的首地址,即的首地址,即&a0*/ for(i=0;i5;i+) *pa=i; /* 给指针给指针pa指向地址赋内容,即给指向地址赋内容,即给ai 赋值赋值*/ pa+; /* 指针加指针加1,即指针,即指针pa指向下一个数组元素指向下一个数组元素 */ pa=a; /* 指针指

18、针pa回到数组回到数组a的首地址的首地址 */ for(i=0;i5;i+) printf(“a%d=%dn”,i,*(pa+i); /* 通过指针通过指针pa输出数组输出数组 a的所有元素值的所有元素值*/ 程序演示程序演示 8.3.2 字符串与指针字符串与指针在语言中,既可以用字符数组表示字符串,也可用字符指针在语言中,既可以用字符数组表示字符串,也可用字符指针变量来表示;引用时,既可以逐个字符引用,也可以整体引用。变量来表示;引用时,既可以逐个字符引用,也可以整体引用。对指向字符变量的指针变量应赋予该字符变量的地址。如:对指向字符变量的指针变量应赋予该字符变量的地址。如: char c,

19、*p=&c;表示表示p是一个指向字符变量是一个指向字符变量c的指针变量。而:的指针变量。而: char *s=C Language;则表示则表示s是一个指向字符串的指针变量,是一个指向字符串的指针变量,把字符串的首地址赋予把字符串的首地址赋予s。1. 逐个引用逐个引用例例8.4 使用字符指针变量表示和引用字符串。使用字符指针变量表示和引用字符串。void main() char *string=”I am a chinese.”; for(; *string!=0; string+) printf(“%c”, *string); printf(“n”); getch(); 程序演示程序演示2.

20、 整体引用整体引用例例8.5 采取整体引用的办法,改写例采取整体引用的办法,改写例8.4。/*程序功能:使用字符指针变量表示和引用字程序功能:使用字符指针变量表示和引用字符串符串*/void main() char *string=”I am a chinese.”; printf(“%sn”,string); getch(); 程序演示程序演示8.3.3 用数组名作函数参数用数组名作函数参数在指针做函数的参数的传递过程中,实参要传变量的地址,形参要定义成指针变量。例例8.6 指针做函数的参数float aver(float *pa);void main()float score5,av,*s

21、p;int i;sp=score; printf(ninput 5 scores:n);for(i=0;i5;i+) scanf(%f,&scorei); av=aver(sp); printf(average score is %5.2f,av);float aver(float *pa) int i;float av,sum=0;for(i=0;i5;i+) sum=sum+*(pa+i); /* 求和 */av=sum/5; /* 求平均值 */return av;程序演示程序演示8.4 二维数组与指针二维数组与指针8.4.1 二维数组的地址二维数组的地址假设一个二维数组int s34。

22、s数组是一个3x4(3行4列)的二维数组。可以将它想象为一个矩阵(详见第6章)。各个数组元素按行存储,即先存储s0行各个元素(s00,.s03),再存储s1行各个元素(s10,.s13),最后存储s2行各个元素(s20,.s23)。二维数组s可以看成由三个一维数组作为数组元素的数组:在这个一维数组中每个数组元素表示为:s0,s1,s2。二维数组任何一个元素二维数组任何一个元素sij的地址可以表示为:的地址可以表示为:(1)&sij(2)si+j(3)*(s+i)+j(4)&s00+4*i+j(5)s0+ 4*i+j 8.4.2 行指针变量行指针变量 行指针变量即指向由行指针变量即指向由n个元素

23、组成的一维数组的指针变量。个元素组成的一维数组的指针变量。1定义格式定义格式 类型说明符类型说明符 (*指针变量指针变量)n; /* n是常量表达式是常量表达式 */注意:注意:“*指针变量指针变量”外的括号不能缺,否则成了指针数组(即外的括号不能缺,否则成了指针数组(即数组的每个元素都是一个指针数组的每个元素都是一个指针指针数组)。指针数组)。2赋值赋值 行指针变量行指针变量 = 二维数组名二维数组名;若有以下定义:若有以下定义:int a34,(*p)4; p=a; 可以通过以下形式来引用可以通过以下形式来引用aij:(1)pij /* 与与aij 对应对应 */(2)*(pi+j) /*

24、 与与*(ai+j)对应对应 */(3)*(*(p+i)+j) /* 与与*(*(a+i)+j) 对应对应 */(4)(*(p+i)j /* 与与(*(a+i)j对应对应 */8.4.3指针数组指针数组1定义格式定义格式指针数组说明的一般形式为:指针数组说明的一般形式为:类型说明符类型说明符 *数组名数组名数组长度数组长度其中类型说明符为指针值所指向的变量的类型。其中类型说明符为指针值所指向的变量的类型。2赋值赋值若有以下定义:若有以下定义:int a34, *p3; 让让p指向数组指向数组a需要用以下语句:需要用以下语句: for(i=0;i3;i+) pi=ai;可以通过以下形式来引用可以

25、通过以下形式来引用aij:(1)pij /* 与与aij 对应对应 */(2)*(pi+j) /* 与与*(ai+j)对应对应 */(3)*(*(p+i)+j) /* 与与*(*(a+i)+j) 对应对应 */(4)(*(p+i)j /* 与与(*(a+i)j对应对应 */本章小结本章小结 1、指针与数组、指针与数组 2、 指针的运算指针的运算(1)取地址运算符取地址运算符&:求变量的地址。:求变量的地址。(2)取内容运算符取内容运算符*:表示指针所指变量的值。:表示指针所指变量的值。(3)赋值运算赋值运算(4)加减运算加减运算对指向数组、字符串的指针变量可以进行加减运算,如对指向数组、字符串的指针变量可以进行加减运算,如p+n,p-n,p+,p-等。对指向同一数组的两个指针变量可以相等。对指向同一数组的两个指针变量可以相减。减。 (5)关系运算关系运算指向同一数组的两个指针变量之间可以进行大于、指向同一数组的两个指针变量之间可以进行大于、小于、小于、 等于比较运算。指针可与等于比较运算。指针可与0比较,比较,p=0表示表示p为空指针。为空指针。 本章练习本章练习 1、教材第、教材第8章课后习题。章课后习题。2、上机练习指针的定义、赋值、引用等。、上机练习指针的定义、赋值、引用等。

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

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

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

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