C语言程序设计 教学课件 ppt 作者 978-7-302-24345-8kj-第9章指针

上传人:w****i 文档编号:94404729 上传时间:2019-08-06 格式:PPT 页数:86 大小:551KB
返回 下载 相关 举报
C语言程序设计  教学课件 ppt 作者 978-7-302-24345-8kj-第9章指针_第1页
第1页 / 共86页
C语言程序设计  教学课件 ppt 作者 978-7-302-24345-8kj-第9章指针_第2页
第2页 / 共86页
C语言程序设计  教学课件 ppt 作者 978-7-302-24345-8kj-第9章指针_第3页
第3页 / 共86页
C语言程序设计  教学课件 ppt 作者 978-7-302-24345-8kj-第9章指针_第4页
第4页 / 共86页
C语言程序设计  教学课件 ppt 作者 978-7-302-24345-8kj-第9章指针_第5页
第5页 / 共86页
点击查看更多>>
资源描述

《C语言程序设计 教学课件 ppt 作者 978-7-302-24345-8kj-第9章指针》由会员分享,可在线阅读,更多相关《C语言程序设计 教学课件 ppt 作者 978-7-302-24345-8kj-第9章指针(86页珍藏版)》请在金锄头文库上搜索。

1、第1页,第章 指针,本章概述 本章的学习目标 主要内容,第2页,本章概述,指针是C语言的特色之一,灵活运用指针可使程序更加高效、简洁。 指针就是内存地址,不同于通过变量名引用内存单元的直接访问方式,使用指针可实现对内存单元的间接访问。 本章介绍指针的有关概念,介绍指针与数组的关系,介绍与函数的关系。,第3页,本章的学习目标,本章教学目的:理解指针的概念和内存访问的关系,掌握指针的定义、引用。熟练使用指针访问基本类型的数据。理解指针与数组的关系,运用指针实现对数组的访问,包括对一维数组和二维数组处理。理解指针与字符串(字符数组)的关系,运用指针操作字符串。理解指针数组的概念,能运用指针数组处理相

2、关的数据类型,尤其是运用字符指针数组处理多个字符串。理解指针与函数的关系,运用指针实现函数调用。理解带参数的main函数作用及各个参数的含义。 本章教学重点:指针的概念,指针与数组的关系。 本章教学难点:指针数组,指针与函数,多重指针。,第4页,主要内容,9.1 指针的基本概念 9.2 指针与一维数组 9.3 指针与字符串 9.4 指针与二维数组 9.5 指针数组与多级指针的概念 9.6 指针与函数 9.7 命令行参数 9.8 程序设计举例,第5页,9.1指针的基本概念,内存是计算机的重要组成部分,在程序的执行过程中,所用到的数据都存于内存中。 内存单元的基本单位是字节,为方便对内存的访问,内

3、存单元的每个字节都有一个编号,这个编号就是内存的地址。 C程序中的每一个变量,在内存中都占用一定数量的内存单元。给变量赋值就是将数据存入对应的内存单元,使用变量时是按照变量所占用的内存单元的地址,从该地址所对应的内存单元中取出变量的值。 因为我们是通过变量的地址来找到存储变量值的内存单元,从而取得了变量的值,所以将变量的地址又称为变量的指针 。,第6页,9.1指针的基本概念,如右图所示,整型变量i占2000、2001两个字节的内存,整型变量j占2002、2003两个字节的内存,其内存单元中存放的是整型数据。而变量p占3000、3001两个字节的内存,其内存单元中存放的是变量i的地址2000(一

4、个变量占多个字节的内存单元时,以首地址表示该变量的地址)。这种存放另一个变量的地址的变量称为指针变量。称变量p指向变量i,p中存储的是变量i的指针。 对一个变量的访问(访问是指取出其值或向它赋值)方式有两种: (1)直接访问:通过变量名访问,如通过变量名i直接访问i。 (2)间接访问:通过指向该变量的指针变量来访问,如通过p访问变量i。,第7页,9.1.1指针变量的定义,指针变量是一类特殊的变量,其值是一个变量的地址。既然是变量,就需要在使用之前先对其定义,然后才可以使用。 指针变量定义的一般形式: 类型标识符 * 标识符; 其中,类型标识符用于指出所定义指针变量可以指向的变量类型,称为指针变

5、量的“基类型”,标识符是指针变量名,“*”表示定义指针变量。,第8页,9.1.1指针变量的定义,例如: int *p1; /*定义指针变量p1,指向整型变量*/ float *p2; /*定义指针变量p2,指向实型变量*/ char *p3; /*定义指针变量p3,指向字符型变量*/,指针变量定义的同时也可以对其初始化,例如: int i; int *p= 这样定义的指针变量p,就指向整型变量i。,第9页,9.1.1指针变量的定义,定义指针变量时应该注意: (1)标识符前的“*”只是一个符号,表示其后的变量是一个指针变量。 (2)指针变量的基类型必须与所指向的变量类型一致,否则会出错。 例如:

6、 float x; int *p1= 是错误的。 因为p1的基类型为整型,而变量x 是单精度类型,数据类型不一致。,第10页,9.1.2指针变量的引用,(1) ”相同,为i赋值100。,第11页,9.1.2指针变量的引用,若有: int i=100; int *p1; p1 = ,第12页,9. 1. 2指针变量的引用,# include int main() int i,j, *p; p= ,程序运行结果为: 10,10 100,100 200,200 程序说明: (1)将变量i的地址赋给了指针变量p之后,*p与i等价。 (2) 语句“ *p=100;”的作用是将100存入由p所指向的变量中

7、,即存入整型变量i中。,例9.1:指针变量的引用,第13页,9. 1. 2指针变量的引用,# include int main() int num1=12, *p1; float num2=3.14, *p2; char ch=p, *p3; p1= ,程序的运行结果为: num1=12, *p1=12 num2=3.14, *p2=3.14 ch=p, *p3=p,例9.2 写出以下程序的运行结果。,程序说明: 从程序的运行结果可以看出num1和*p1、num2和*p2、ch1和*p3是等价的 。,第14页,9. 1. 2指针变量的引用,# include int main() int nu

8、m1,num2; int *p1= ,程序运行结果: Input the first number:9 Input the second number:6 num1=9, num2=6 min=6, max=9,例9.3 使用指针变量求解:输入2个整数,按从小到大顺序输出。,第15页,程序说明: (1)程序中的if语句,若*p1*p2 (即num1num2),则交换指针,使p1指向变量num2(较小值),p2指向变量num1(较大值)。 (2)“printf(“min=%d, max=%dn”, *p1, *p2);” 语句,通过指针变量,间接访问变量的值。 本例的处理思路是:交换指针变量p1

9、和p2的值,而不是交换变量num1和num2的值(变量num1和num2并未交换,仍保持原值),最后通过指针变量输出处理结果。,例9.3 使用指针变量求解:输入2个整数,按从小到大顺序输出。,第16页,9.2 指针与一维数组,数组和指针有密切的关系,数组名代表数组的首地址。 当一个指针指向数组后,对数组元素的访问,既可以使用数组下标,也可以使用指针。 用指针访问数组元素,程序的效率更高;用下标访问数组元素程序更清晰。,第17页,9.2.1 指向数组元素的指针,在C语言中,当一个数组a被定义后,数组名a本身就代表了该数组的首地址,并且它是一个地址常量,数组元素的地址可以通过数组名a加下标值来取得

10、。 a即a+0代表数组元素a0的地址,a+1代表数组元素a1的地址,a+2代表数组元素a2的地址, 。,若定义一个指针变量,使其指向一个数组,则该指针变量称为指向数组的指针变量,其定义与指向普通变量的指针变量的定义方法是一样的。 例如: int a10, *p; 则: pa; 或者:p= 上面两个语句是等价的,都表示把数组a的首地址赋给指针变量p。,第18页,指针变量也可以指向数组的其它元素。例如: int *p1, *p2; int a10 = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10; 此后可以赋值: p1 = 完成了赋值之后,指针p1指向数组a的首元素,p2指向数组元素

11、a4。 对于上面所写&a0的表达形式,由于数组元素访问运算符的优先级更高,所以这里不必写成&(a0)的形式。,9.2.1 指向数组元素的指针,第19页,9.2.2 通过指针引用数组元素,数组定义和初始化之后,数组元素可以通过数组的下标、数组名或指向数组的指针变量来引用。若定义一个一维数组: int a10 = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10; 可以通过数组的下标访问数组元素:如: printf(“%d”,a5);,也可以通过数组名访问数组元素:如: *(a+0)即*(a)与a0相等,*(a+1)与a1相等, *(a+2)与a2相等,*(a+i)与ai相等,。 但使用

12、数组名时,注意不能用a+的方式,因为a是地址常量,常量是不能被重新赋值的。,第20页,同样,若定义指针变量p(int *p;),并使p指向数组a(即p=a),则可以用指针变量来访问数组元素,如右图所示。p指向数组的第一个元素a0,则p+1指向数组的下一个元素a1,p+2指向数组元素a2,p+i指向数组元素ai ,。 可以使用*(p+i)访问元素ai。 p+i等价于a+i,都表示元素ai的地址。 指向数组的指针变量也可以带下标,如pi与*(p+i)等价,表示元素ai。,9.2.2 通过指针引用数组元素,数组元素ai的4种引用方式: ai、*(a+i)、*(p+i)、pi 。 引用数组元素ai地址

13、的4种方式为: &ai、a+i、p+i、&pi。,第21页,另外,在使用指向数组的指针变量时,注意对指针变量p+1的理解。 若数组元素是int型,p+1所表示的地址是p的地址值加2个字节;若数组元素是float型,p+1所表示的地址是p的地址值加4个字节;若数组元素是char型,p+1所表示的地址是p的地址值加1个字节。,9.2.2 通过指针引用数组元素,第22页,当指针变量p中存储的是数组a的首地址(p=a)时,执行p+后,p中存储的是数组元素a1的地址,再执行p+后,p中存储的是数组元素a2的地址,。 若数组元素是int型,执行p+后,p中存储的地址是p中原来存储的地址值加2个字节;若数组

14、元素是float型,执行p+后,p中存储的地址是p中原来存储的地址值加4个字节(如右图);若数组元素是char型,执行p+后,p中存储的地址是p中原来存储的地址值加1个字节。 若p中存储的是元素ai(i1)的地址,根据上面的叙述,读者可以思考如何理解p-1、p-。,9.2.2 通过指针引用数组元素,第23页,9.2.2 通过指针引用数组元素,int main() int a10, *p=a, i,sum; printf(“Input 10 numbers: ”); for(i=0; i10; i+) scanf(“%d”, p+i); /*使用指针变量来输入数组元素的值*/ printf(“a

15、rray a: ”); for(i=0; i10; i+) printf(“%d ”, *(p+i) ; /*使用指向数组的指针变量输出数组元素的值*/ sum=sum+*(p+i) ; printf(“n sum=%d n”, sum); return 0; ,程序运行情况: Input 10 numbers: 0 1 2 3 4 5 6 7 8 9 array a: 0 1 2 3 4 5 6 7 8 9 sum=45,例9.4 使用指向数组的指针变量来引用数组元素。,第24页,# include int main() int a10, *p=a, i,sum; printf(“Input

16、 10 numbers: ”); for(i=0; i10; i+,p+) scanf(“%d”, p); printf(“array a: ”); p=a; /*使p重新指向数组的第一个元素*/ for(i=0; i10; i+,p+) printf(“%d”,*p); sum=sum+*(p+i) ; printf(“n sum=%d n”, sum); return 0; ,程序说明: (1) 用指针变量直接指向数组元素,不必每次都重新计算地址。这种有规律地改变地址值(p+)的方法能较好地提高执行效率。 (2) 用下标法比较直观,能直接知道操作的是数组的第几个元素。,9.2.2 通过指针引用数组元素,例9.4程序也可写为:,第25页,9.2.3 指针使用的几个细节,1空指

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

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

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