C语言程序设计 教学课件 ppt 作者 柴世红_ 第11章

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

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

1、,第11章 指 针,11.1 变量的指针 11.2 指针变量 11.3 指针变量的使用 11.4 指针与数组 11.5 字符串与指针 11.6 指向函数的指针 11.7 返回指针值的函数 11.8 指针数组 11.9 链表 11.10 有关指针的数据类型小结,11.1 变 量 的 指 针 为了正确地访问这些内存单元,必须为每个内存单元编号。根据一个内存单元的编号就可以准确地找到该内存单元。因此内存区的每一个字节都有一个编号,这就是地址,通俗地说,它相当于旅馆中的房间号;在地址所标志的内存单元中存放数据,这就相当于每个房间中居住旅客一样。内存单元的地址与内容两个概念的区别如图11.1所示。,图1

2、1.1 内存用户数据区数据存储示例,【例11-1】 显示变量的值及地址。,图11.2 例11-1运行结果,11.2 指 针 变 量 1间接访问形式 假设定义了一个变量i_pointer,用来存放整型变量的地址,它被分配内存地址为3010、3011的字节单元。可以通过下面的语句将i的地址(2000)存放到i_pointer中: i_pointer=,2间接访问方式和直接访问方式的对比 例如,为了打开A抽屉,有两种办法:一种是将A钥匙随身携带,需要时直接找出该钥匙打开抽屉,取出所需的东西;另一种办法是将A钥匙放到另一抽屉B中锁起来。如果需要打开A抽屉,就需要先找出B钥匙,打开B抽屉,取出A钥匙,再

3、打开A抽屉,取出A抽屉中的物品,这就是间接访问。 图11.3是直接访问和间接访问的示意图。,图11.3 直接访问和间接访问的示意图,3间接访问运算符“*” 为了表示指针变量和它所指向的变量的联系,在程序中用“*”符号表示“指向”关系。例如,i_pointer代表指针变量,而*i_pointer是i_pointer所指向的变量,如图11.4所示。,图11.4 指针变量示意图,11.3 指针变量的使用 11.3.1 指针变量的定义 C语言规定所有变量在使用前必须定义,指定其类型,并按此分配内存单元。指针变量不同于整型变量和其他类型的变量,它是专门用来存放地址的,必须将它定义为指针类型。那么指针变量

4、该如何定义呢?例如: int i , j ; int *pointer_1 , *pointer_2;,图11.5 将变量地址存放到指针变量中,11.3.2 指针变量的引用 指针变量中只能存放地址(指针),不要将一个整型量(或任何其他非地址类型的数据)赋给一个指针变量。例如,下面的赋值是不合法的: pointer_1=100; /*pointer_1是指针变量,100为整数*/,【例11-2】 通过指针变量访问整型变量。,图11.6 例11-2运行结果,图11.7 例11-2示意图,11.3.3 运算符“&”和“*”的结合方向 【例11-3】 输入a和b两个整数,按先大后小的顺序输出a和b。,

5、图11.8 例11-3的运行结果,代码说明:当输入a=2,b=9时,由于ab,将p1和p2交换。交换前的情况如图11.9(a)所示,交换后的情况如图11.9(b)所示。,图11.9 p1和p2交换前后示意图,11.3.4 指针变量作函数参数 【例11-4】 输入两个整数,按大小输出(指针变量作函数参数)。,图11.10 例11-4运行结果,图11.11 例11-3执行过程中变量交换示意图,图11.12 值的单向传递,图11.13 变量交换示意图,11.4 指 针 与 数 组 11.4.1 指向数组元素的指针 定义一个指向数组元素的指针变量的方法,与前面介绍的指向变量的指针变量相同。例如: in

6、t a10 ; /*定义a为包含10个整型数据的数组*/ int *p; /*定义p为指向整型变量的指针变量*/,下面是给指针变量p赋值: p= /*将a0元素的地址赋给指针变量p, 也就是说,指针变量p指向 数组下标 为0的元素,如图11.14所示*/,图11.14 指向数组元素的指针,11.4.2 通过指针引用数组元素 假设p已被定义为指针变量,并已给它赋了一个地址,使它指向某一个数组元素。如果有以下赋值语句: *p=1; 表示对p当前所指向的数组元素赋予一个值(值为1)。,图11.15 通过指针引用数组元素,【例11-5】 使用指针变量来计算数组中所有元素的总和。,图11.16 例11-

7、5运行结果,11.4.3 指向二维数组的指针变量 1二维数组的地址表示 二维数组的首地址是这片连续存储空间的起始地址,它既可以用数组名表示,也可以用数组中第一个元素的地址表示。假设有如下定义: int a34=1,3,5,7,9,11,13,15,17,19,21,23;,2二维数组的指针变量 二维数组指针变量的一般形式如下: 基类型 (*指针变量名)长度,【例11-6】 输出二维数组任一行任一列元素的值。,图11.17 例11-6运行结果,11.5 字符串与指针 11.5.1 用字符数组表示字符串 将字符串的各个字符(包括串结束标志 0)依次存放到字符数组中,利用下标变量对数组进行操作。,【

8、例11-7】 定义一个字符数组,对它进行初始化,然后输出该字符串。,图11.18 例11-7运行结果,11.5.2 用字符指针表示字符串 对字符串而言,可以不定义字符数组,而是直接定义指向字符串的指针变量,利用该指针变量对字符串进行操作。,【例11-8】 定义一个字符型指针变量,并对它进行初始化,然后输出该字符串。,图11.19 例11-8运行结果,图11.20 字符指针处理字符串,【例11-9】 使用字符指针来确定字符串的长度。,图11.21 例11-9运行结果,11.6 指向函数的指针 与变量一样,函数在内存中也需要存储地址。C语言允许定义一个指向函数的指针。该指针又可以作为一个参数在另一

9、个函数中使用。 (1) 指向函数的指针变量的定义: 数据类型 (*指针变量名)( ); 这里的数据类型是指函数返回值的类型。,(2) 指向函数的指针变量的赋值: 指针变量名=函数名; 表示将函数的入口地址赋给指针变量。 (3) 使用指针变量调用函数: (*指针变量名)(实际参数列表) 使用指向函数的指针变量调用函数时,只需用(*指针变量名)代替函数名即可。,【例11-10】 函数指针的综合示例:使用函数指针作为函数参数。,图11.22 例11-10运行结果,11.7 返回指针值的函数 一个函数可以带回一个整型值、字符值、实型值等,也可以带回指针型的数据,即地址。这个概念与返回整型、字符型、实型

10、值的函数概念类似,只是返回的值是指针类型 而已。 返回指针类型数据的函数定义的一般形式如下: 类型名 *函数名(参数列表),【例11-11】 返回指针值的函数。,图11.23 例11-11运行结果,11.8 指 针 数 组 11.8.1 指针数组的概念 一个数组,其元素均为指针类型的数据,就称为指针数组,也就是说,指针数组中的每一个元素都是一个指针变量。一维指针数组定义的形式如下: 类型名 *数组名 数组长度 ,例如: int *p4 ; /*定义了一个一维指针数组p,包含4个整型指针*/ char *q5; /*定义了一个一维指针数组q,包含5个字符型指针*/,图11.24 字符串数组与指针

11、数组存储字符串对比,【例11-12】 将若干个字符串按字母顺序(由小到大)输出。,图11.25 例11-12运行结果,11.8.2 指针数组作main函数的形参 指针数组的一个重要应用是作为main函数的形参。在以往的程序中,main函数的第一行一般写成以下形式: main() 括号中是空的。实际上,main函数可以有形参,其参数形式如下所示: main( int argc , char *argv ),命令行的一般形式为 命令名 参数1 参数2 参数n 命令名和各参数之间用空格分隔。例如,若有一目标文件名为file1,要将两个字符串“China”,“Beijing”作为传送给main函数的参

12、数,可以写成以下形式: file1 China Beijing,图11.26 main函数的参数,【例11-13】 指针数组作main函数的形参。,图11.27 例11-13运行结果,11.9 链 表 11.9.1 链表概述 1单链表结构 链表根据需要开辟内存单元。图11.28表示最简单的单向链表的结构。,图11.28 单链表结构,2链表中结点的结构 可以看到,链表结点中要存放下一元素的地址,必须利用指针变量才能实现。第10章介绍的结构体变量,用它作链表中的结点是最合适的。一个结构体变量包含若干个成员,这些成员可以是数值类型、字符类型、数组类型,也可以是指针类型。,例如,可以设计这样一个结构体

13、类型:,图11.29 单链表结点结构,11.9.2 处理动态链表所需的函数 链表是动态地分配存储的,即在需要时才开辟一个结点的存储单元,不需要时释放结点空间。怎样动态地开辟和释放存储单元呢?C语言编译系统的库函数提供了以下有关 函数: (1) malloc函数。其函数原型为: void *malloc(unsigned int size);,(2) calloc函数。其函数原型为: void *calloc(unsigned n , unsigned size); (3) free函数。其函数原型为: void free(void *p); (4) realloc函数。其函数原型为: void *realloc(void *ptr, unsigned int size);,11.9.3 链表的建立和输出 所谓建立动态链表是指在程序执行过程中从无到有地建立起一个链表,即一个一个地开辟结点和输入各结点数据,并建立起前后相链的关系。,【例11-14】 链表的建立和输出。,图11.30 例11-14运行结果,11.10 有关指针的数据类型小结 前面已经用到了有关指针的数据类型和指针的运算,为了使读者对此知识点有一个完整的认识,在这里作一总结。表11.1是有关指针的数据类型的总结,为了便于比较,把其他一些类型的定义也列在一起。,

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

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

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