C语言程序设计 教学课件 ppt 作者 张强华 吕新平 第11章

上传人:E**** 文档编号:89344598 上传时间:2019-05-23 格式:PPT 页数:25 大小:92KB
返回 下载 相关 举报
C语言程序设计 教学课件 ppt 作者  张强华 吕新平 第11章_第1页
第1页 / 共25页
C语言程序设计 教学课件 ppt 作者  张强华 吕新平 第11章_第2页
第2页 / 共25页
C语言程序设计 教学课件 ppt 作者  张强华 吕新平 第11章_第3页
第3页 / 共25页
C语言程序设计 教学课件 ppt 作者  张强华 吕新平 第11章_第4页
第4页 / 共25页
C语言程序设计 教学课件 ppt 作者  张强华 吕新平 第11章_第5页
第5页 / 共25页
点击查看更多>>
资源描述

《C语言程序设计 教学课件 ppt 作者 张强华 吕新平 第11章》由会员分享,可在线阅读,更多相关《C语言程序设计 教学课件 ppt 作者 张强华 吕新平 第11章(25页珍藏版)》请在金锄头文库上搜索。

1、第11章 指针,C语言的特色之一、也是其精华所在就是指针。使用指针可以实现以下用其它方法不易实现的操作:对内存中的数据进行处理,而不管这些数据的类型;在函数之间快速地传递数据;直接处理内存地址。这种方法增强了C语言的处理能力、提高了程序的执行效率,尤其是适合系统软件的开发,也极大地增强了程序的灵活性。指针不仅不易理解,而且使用不当会带来严重的错误。可以说,是否掌握指针,是业余爱好者与专业程序员的分水岭。 学好指针,关键是理解其概念与操作原理。,退出,11.1 指针的基本概念 11.2 指针变量的运算 11.3 数组指针变量的说明和使用 11.4 字符串指针变量的说明和使用 11.5 函数指针变

2、量 11.6 指针型函数,11.1 指针的基本概念,11.1.1 了解指针 在计算机中,所有的数据都是存放在存储器中的。为了正确地访问这些内存单元,必须为每个内存单元编上号。根据一个内存单元的编号即可准确地找到该内存单元。内存单元的编号也叫做地址。通常也把这个地址称为指针。 对于一个内存单元来说,单元的地址即为指针,其中存放的数据才是该单元的内容。通常用一个变量来存放指针,这种变量称为指针变量。因此,一个指针变量的值就是某个内存单元的地址或称为某内存单元的指针。,11.1.2 指针变量的类型说明 对指针变量的类型说明包括三个内容: 指针类型说明,即定义变量为一个指针变量; 指针变量名; 变量值

3、(指针)所指向的变量的数据类型; 其一般形式为: 类型说明符 *变量名; 其中,*表示这是一个指针变量,变量名即为定义的指针变量名,类型说明符表示本指针变量所指向的变量的数据类型。,例如: int *p; 表示p是一个指针变量,它的值是某个整型变量的地址。或者说p指向一个整型变量。至于p究竟指向哪一个整型变量,应由向 p赋予的地址来决定。再如: static int *p; /* p是指向静态整型变量的指针变量 */ float *p; /* p是指向浮点变量的指针变量 */ char *p; /* p是指向字符变量的指针变量 */ 指针变量本身一定是整数(就像房间号一样),类型差别只是所指地

4、址中存放的数据的差别。 指针应具有“始终如一”的特点,也就是说,一个指针变量只能指向同类型的变量,不能时而指向一个浮点变量,时而又指向一个字符变量。这就好比商品的标签一样,贴计算机的标签不能贴在化妆品。,11.1.3 指针变量的赋值 指针变量也是变量,所以与普通变量同样,必须在使用前赋值。未经赋值的指针变量不能使用。当然,指针变量的赋值只能赋予地址,而不能赋予其它数据。因为变量的地址是由编译系统分配的,所以用户不知道变量的具体地址。因此,通过与变量之间的关系来确定它的值。引入地址运算,(2) 赋值语句的方法 int a; int *p; p= 在赋值语句中,被赋值的指针变量前不能再加“*”说明

5、符,如写为*p=&a也是错误的。,11.2 指针变量的运算,指针变量可以进行某些运算,但其运算的种类是有限的。它只能进行地址、赋值及很少一些算术运算和关系运算。 11.2.1 指针运算符 1 取地址运算符& 其功能是取变量的地址。&是单目运算符,其结合性为自右至左。在前面的许多例子中,我们已经使用了&运算符。如&a,&b。,2 取内容运算符* 用于表示指针所指的变量。*是单目运算符,其结合性为自右至左。如*p1,*p2。 在*运算符之后跟的变量必须是指针变量。 注意,指针运算符*和指针变量说明中的指针说明符*的意义并不相同。在指针变量说明中,“*”是类型说明符,表示其后的变量是指针类型。而表达

6、式中出现的“*”则是一个运算符用以表示指针变量所指变量的内容。 【例11-1】(见课本),11.2.2 指针变量的运算 1 赋值运算 指针变量的赋值运算有以下几种形式。 (1) 指针变量初始化赋值 参见上页。 (2) 传递地址 把一个变量的地址赋予指向相同数据类型的指针变量。例如: int a,*pa; pa= /*把整型变量a的地址赋予整型指针变量pa*/,(3) 传递指针 把一个指针变量的值赋予指向相同类型变量的另一个指针变量。如: int a,*pa=,(5) 取字符串首地址 把字符串的首地址赋予指向字符类型的指针变量。例如: char *pc; pc=“Hello“; 或用初始化赋值的

7、方法写为: char *pc=“Hello“; 注意,并不是把整个字符串装入指针变量,而是把存放该字符串的字符数组的首地址装入指针变量。 (6) 去函数的入口地址 把函数的入口地址赋予指向函数的指针变量。例如: int (*pf1)(); pf1=f; /* f1为函数名 */,2 加减算术运算 由于指针是整数,所以可加上或减去一个整数n。设pa是指向数组a的指针变量,则以下运算都可以: pa+n,pa-n,pa+,+pa,pa-,-pa 指针变量加或减一个整数n的意义为:把指针指向的当前位置(指向某数组元素)向前或向后移动n个位置。这有点像数据库中的在记录之间移动。 数组指针变量向前或向后移

8、动一个位置表示指针变量指向下一个数据元素的首地址。而不是在原地址基础上加1。,指针没有移动之前: 数组a: a1 a2 a3 a4 a5 a6 指 针 指针向后移动一个位置: 数组a: a1 a2 a3 a4 a5 a6 指 针 指针变量的加减运算只能对数组指针变量进行,对指向其它类型变量的指针变量作加减运算是毫无意义的。,3 两指针变量相减 运算只能在同一数组的两个指针变量之间进行。 两指针变量相减所得之差是两个指针所指数组元素之间相差的元素个数。实际上是两个指针值(地址)相减之差再除以该数组元素的长度(字节数)。 另外,两个指针变量不能进行加法运算,因为没有实际含义。 【例11-2】(见课

9、本) 【例11-3】(见课本),11.3 数组指针变量的说明和使用,11.3.1 数组的存储方式 一个数组在内存中占据连续的内存单元。数组名为此连续内存单元的首地址。一个数组元素也可以占据几个连续的内存单元(取决于数组元素的数据类型)。一个数组元素的首地址也是指它所占有的几个内存单元的首地址。,11.3.2 数组指针变量 指向数组的指针变量称为数组指针变量。一个指针变量既可以指向一个数组,也可以指向一个数组元素,可把数组名或第一个元素的地址赋予它。如要使指针变量指向第i号元素可以把i元素的首地址赋予它或把数组名加i赋予它。 可以用以下两种方法来访问数组元素:其一为下标法,即用ai形式访问数组元

10、素,这是较为普通的方法。其二为指针法,即采用*(pa+i)形式,用间接访问的方法来访问数组元素。 【例11-4】(见课本) 【例11-5】(见课本) 【例11-6】(见课本),11.4 字符串指针变量的说明和使用,字符串指针变量的定义说明与指向字符变量的指针变量说明是相同的。只能按对指针变量的赋值不同来区别。对指向字符变量的指针变量应赋予该字符变量的地址。如: char c,*p= 则表示s是一个指向字符串的指针变量。把字符串的首地址赋予s。 【例11-7】(见课本) 【例11-8】(见课本),11.5 函数指针变量,如前所说,指针变量可以指向整型变量、字符变量和数组等。下面讲述把指针变量指向

11、函数的用法。这种指向函数的变量叫做函数指针变量。 为什么指针可以指向函数呢?这要从函数的存储特性说起。 尽管函数并不是一个变量。但是,一个函数总是占用一段连续的内存区,而函数名就是该函数所占内存区的首地址。因此可以把函数的首地址(或称入口地址)赋予一个指针变量,使该指针变量指向该函数。然后通过指针变量就可以找到并调用这个函数。,11.5.1 函数指针变量的定义 函数指针变量定义的一般形式为: 类型说明符 (*指针变量名)(); 其中: “类型说明符”表示被指函数返回值的类型。 “(* 指针变量名)”表示“*”后面的变量是定义的指针变量。 最后的空括号“()”表示指针变量所指的是一个函数。例如:

12、 int (*p)(); 表示p是一个指向函数入口的指针变量,该函数的返回值(函数值)是整型。 这里的函数指针变量p并不固定地指向某一具体函数。在程序中把那个函数的地址赋给它,它就指向那个函数。这就是其“变量”属性的特点。当然,函数返回值的类型应与它的类型一致。 【例11-9】(见课本),11.5.2 函数指针变量的调用 调用函数的一般形式为: (*指针变量名) (实参表) 比较如下两种调用形式: c=(*p)(a,b); c=max(a,b); 形式上只是用(*p)替代函数名而已。 使用函数指针变量还应注意以下两点: 不能对函数指针变量进行算术运算,这与数组指针变量不同。数组指针变量加减一个

13、整数可使指针移动指向后面或前面的数组元素,而函数指针的移动毫无意义; 函数调用中“(*指针变量名)”的两边的括号不可少;,11.5.3 函数指针变量的赋值 给函数指针变量赋值时,只需要给出函数名,而无需给出参数。因为赋值只是把函数的入口地址赋给指针变量,并不涉及实参与形参。例如: p=max; 不能写为: p=max(a,b); 11.5.4 函数指针变量的无参调用 可以使用如下形式来调用无参函数: (*p)();,11.6 指针型函数,如前所述,函数可以返回整数型、实数型及字符型的值。其实,它也可以返回指针型的值。这种返回指针值的函数称为指针型函数。 11.6.1 指针型函数的定义 定义指针

14、型函数的一般形式为: 类型说明符 *函数名(形参表) 函数体 其中的“*”表明这是一个指针型函数,即返回值是一个指针。类型说明符表示了返回的指针所指向的数据类型。 【例11-10】(见课本),11.6.2 指针型函数必须在主函数中说明 要使用一个指针型函数,必须在主函数中对所定义的函数加以说明(参看例11-11)。 11.6.3 局部变量不可返回 不能把指针型函数的内部说明的局部变量的地址作为返回值。这是因为局部变量在函数运行结束后被释放,相应的地址也要让出来,可能存放其它数据。例11-11中所使用的就是静态变量。 11.6.4 一致性 指针型函数中return语句的返回值必须与函数的数据类型相一致的指针。,11.6.5 区别指针型函数与函数指针 应特别注意函数指针变量和指针型函数的区别,它们不仅书写形式不同,意义也不相同。以int (*p)()和int *p()为例:首先书写形式不同。其次意义不同:int (*p)()是一个变量说明,说明p是一个指向函数入口的指针变量,该函数的返回值是整型量,(*p)的两边的括号不能少;int *p()则不是变量说明而是函数说明,说明p是一个指针型函数,其返回值是一个指向整型量的指针,*p两边没有括号。 【例11-11】(见课本),

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

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

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