C语言程序设计基础教学课件(共11章)第8章指针

上传人:sat****105 文档编号:325451880 上传时间:2022-07-18 格式:PPTX 页数:244 大小:3.14MB
返回 下载 相关 举报
C语言程序设计基础教学课件(共11章)第8章指针_第1页
第1页 / 共244页
C语言程序设计基础教学课件(共11章)第8章指针_第2页
第2页 / 共244页
C语言程序设计基础教学课件(共11章)第8章指针_第3页
第3页 / 共244页
C语言程序设计基础教学课件(共11章)第8章指针_第4页
第4页 / 共244页
C语言程序设计基础教学课件(共11章)第8章指针_第5页
第5页 / 共244页
点击查看更多>>
资源描述

《C语言程序设计基础教学课件(共11章)第8章指针》由会员分享,可在线阅读,更多相关《C语言程序设计基础教学课件(共11章)第8章指针(244页珍藏版)》请在金锄头文库上搜索。

1、第8章 指针对存储信息的引用机制第8章 指针对存储信息的引用机制8.1 指针的概念指针的概念8.2 通过指针引用变量的值通过指针引用变量的值8.3 通过指针引用一维数组元素通过指针引用一维数组元素8.4 通过指针引用二维数组通过指针引用二维数组8.5 通过指针引用字符串通过指针引用字符串8.6 通过指针调用函数通过指针调用函数8.7 多重指针与指针数组多重指针与指针数组8.8 用于动态内存分配的指针型函数用于动态内存分配的指针型函数实操训练实操训练课外练习课外练习第8章 指针对存储信息的引用机制8.1 指指针针的的概概念念指针指针是什么?为什么通过指针可以访问存储器中的信息是什么?为什么通过指

2、针可以访问存储器中的信息?指针的一般意义大家都不会陌生,那就是建立一种指向,如仪器仪表的指针,路标指针等。C语言指针也是建立一种指向,只是指向的是存储器单元,按其所指访问存储器单元中的信息。要理解C语言中指针的内涵,需了解对存储器的访问机制。第8章 指针对存储信息的引用机制计算机对存储器是按地址进行访问的。存储器包含大量的信息单元,为能方便地访问需要的信息单元,每一个单元都有一个编号,这个编号称为地址。要访问某一个单元,只要给出该单元的地址,就能准确引用该单元信息。打个通俗的比方,一个楼房包含许多房间,为能方便地寻找某个房间,给每一个房间编一个号码,知道了房号就能准确地找到这个房间。由此可知,

3、地址就是对存储器单元的指向,即给出地址就能访问存储器单元,访问存储器单元必须有地址。C语言中的指针就是存储器单元的地址,也可以反过来说,地址就是存储器单元的指针。简言之,指针就是地址,地址就是指针。因此,指针是对存储器单元信息的一种引用机制。第8章 指针对存储信息的引用机制地址属于一个与存储器硬件特性相关的概念。在高级语言中,编程人员不涉及计算机的硬件特性,对硬件资源的分配与处理由编译系统来完成。在前面学习变量、数组、函数时,仅是按语言规定进行定义,按所定义的符号名称进行引用,未涉及按地址引用的问题。事实上,程序在编译时,系统给定义的数据对象或函数都要分配相应的存储单元,符号名称也具有相应的地

4、址值,符号名实际上标识了一个存储单元的地址。第8章 指针对存储信息的引用机制比如,在一个程序中定义了3个整型变量i、j、k,程序编译时,系统就会给3个变量分别分配4个字节的存储单元,单元中存储变量的值,i、j、k也分别具有相应的地址值。假定3个变量的值分别为2、4、8,编译时给i、j、k分配的地址值分别是1000、1004、1008,其存储情况如图8.1所示。第8章 指针对存储信息的引用机制图8.1 数据引用示意图第8章 指针对存储信息的引用机制在程序中,用变量名引用变量的值,在计算机内部执行时,是按变量名所具有地址值的单元引用其存储内容。例如:printf(“%d”,i);输出结果是1000

5、地址单元的内容“2”。又如:printf(“%X”,&i);则输出变量i的地址值“1000”。第8章 指针对存储信息的引用机制对存储器单元的访问有两种方式:一种是直接访问,另一种是间接访问。直接访问是直接引用地址所指向单元中的内容。按变量名引用变量的值属于直接访问。第8章 指针对存储信息的引用机制间接访问是将欲访问变量的地址存放在另一个变量中,先通过该变量取得欲访问变量的地址,再按这个地址引用变量的值。打个通俗的比方,从一个抽屉中存取东西,人们也可采取两种方式:一种是将一个抽屉A的钥匙带在身上,需要时直接用A抽屉钥匙,打开A抽屉,存取所需东西;另一种是将A抽屉钥匙放在另一抽屉B中,锁起来,需要

6、打开A抽屉时,先要用B钥匙打开B抽屉,取出A钥匙后,再打开A抽屉,才能存取其中的东西。这就是一个间接访问的过程。第8章 指针对存储信息的引用机制例如,我们将i变量所标识的存储单元的地址(1000)存放在i_pointer变量中,现要引用i变量的值,先要访问i_pointer变量,从中取得i变量的地址,然后才能按此地址所指向的i变量取得所需要的值。访问过程如图8.1所示。第8章 指针对存储信息的引用机制为了实现一个变量的间接访问,需引入另外一种变量,称之为指针变量。如果一个变量专门用来存放另一个变量的地址(即指针),则称这个变量为指针变量。也就是说,指针变量的值是地址(即指针)。从存储器的访问机

7、制,我们引入了“指针”和“指针变量”,弄清楚这两个概念的内涵,对学习本章后续内容是至关重要的。第8章 指针对存储信息的引用机制8.2 通过指针引用变量的值通过指针引用变量的值怎样通过指针引用变量的值?怎样通过指针引用变量的值?从上节已知,通过指针可以引用变量的值,通过指针变量可以实现变量值的间接引用。使用指针和指针变量给变量值的引用带来了许多灵活多变的方法和技巧,请读者在本节内容的学习中认真体会。第8章 指针对存储信息的引用机制8.2.1 指针变量的定义与初始化指针变量的定义与初始化在在程序中怎样使用指针变量?程序中怎样使用指针变量?指针变量是有别于普通变量的,也必须先定义后使用。指针变量定义

8、的一般形式为基类型符*指针变量名;其中,基类型符是基本数据类型关键字,如int、float、char、double等,用来指定所定义指针变量可以指向的变量类型,简单地说,就是指针变量所指的数据对象的类型。第8章 指针对存储信息的引用机制“*”规定了所定义的变量是指针型变量。反过来说,没有此星号,那就成为普通变量的定义了。指针变量名是所定义的指针变量的标识符,其命名规则同普通变量定义中的变量名一样。注注:*和指针变量名之间可以有空格,也可以没有空格,两者均可。第8章 指针对存储信息的引用机制下面是指针变量定义的几个例子:int*pi1;语句定义了1个指针变量pi1,它只可以指向整型变量。char

9、*pc1,*pc2;语句定义了2个指针变量pc1和pc2,它们只可以指向字符型变量。float*pf1,*pf2,*pf3;语句定义了3个指针变量pf1、pf2和pf3,它们只可以指向实型变量。第8章 指针对存储信息的引用机制定义了指针变量,仅声明了所定义的变量是指针类型和可指向的变量类型,并没有确定的指向,也就是说,没有具体指向哪一个变量或存储器单元。打个通俗的比方,我们加工出一些指针,在没有安装到某一个仪器仪表前,它们没有具体的指向。要使所定义的指针变量指向某一个变量,必须将指针变量初始化,将所要指向变量的地址赋给指针变量。指针变量中只能存放地址(即指针)。若要给指针变量赋数值则毫无意义。

10、指针变量初始化可有两种方式:一是先定义指针变量,然后进行初始化;二是定义指针变量的同时初始化。第8章 指针对存储信息的引用机制第8章 指针对存储信息的引用机制这是一个先定义指针变量再初始化的例子。下面则是一个定义指针变量的同时初始化的例子:注意:注意:定义指针变量可指向变量的类型与初始化赋地址的变量类型必须保持一致,否则会出现错误。如下面的初始化是错误的。第8章 指针对存储信息的引用机制因定义的两个指针变量是指向整型数据的,而变量a、b被定义为实型,所以出现了类型不一致的错误。第8章 指针对存储信息的引用机制8.2.2 指针变量的引用指针变量的引用通过指针变量怎样间接引用变量的值?通过指针变量

11、怎样间接引用变量的值?在指针变量的引用中要使用两个运算符“&”和“*”。“&”是取地址运算符,例如&a是取变量a的地址;“*”是间接引用运算符,其后跟指针变量,是取该指针变量所指向的数据,例如*p表示指针变量p所指向的数据。指针变量有两种引用:一是通过指针变量引用所指向变量的值,也就是说,通过指针变量实现变量值的间接引用;二是指针变量是变量,其值也可以引用,只不过引用的是地址(指针)值。下面通过两个例子来说明两种引用和指针变量的应用。第8章 指针对存储信息的引用机制例例8.1 分析下面程序的运行结果:第8章 指针对存储信息的引用机制分析:程序中第1个printf函数调用中,输出变量a、b的值,

12、属于变量值的直接引用,对应执行结果的第1行;第2个printf函数调用中,输出指针变量pointer_1、pointer_2所指向变量的值,pointer_1指向变量a,pointer_2指向变量b,属于变量值的间接引用,对应执行结果的第2行;第3个输出函数调用中,以十六进制格式输出指针变量pointer_1、pointer_2的值,即变量a、b的地址,也属于变量值的直接引用,其地址值是系统分配的。第8章 指针对存储信息的引用机制例例8.2 利用指针方法实现:输入两个整数,按先大后小的顺序输出。编程思路:输入两个整数,分别赋给两个变量,比较两个变量的值,利用指针变量可以不交换两个变量的值,而只

13、交换两个指针变量的值(即改变指向)。第8章 指针对存储信息的引用机制第8章 指针对存储信息的引用机制分析:输入值2、8,即ab,指针变量p1和p2的值进行交换。交换前的情况如图8.2(a)所示,交换后的情况如图8.2(b)所示。第8章 指针对存储信息的引用机制从图可以看出,变量a、b的值并未交换,交换了指针变量p1、p2的值,实际上改变了指向,p1原指向a,交换值后指向b,p2原指向b,交换值后则指向a。这样输出*p1、*p2时,就输出变量b和变量a的值。if语句中采用了两个指针变量值的交换p=p1;p1=p2;p2=p;,可改为p1=&b;p2=&a;,效果是一样的。第8章 指针对存储信息的

14、引用机制图8.2 指针变化示意图第8章 指针对存储信息的引用机制8.2.3 指针变量作函数参数指针变量作函数参数指针变量作函数参数传递什么值?函数之间能建立什么指针变量作函数参数传递什么值?函数之间能建立什么联系?联系?在“函数”一章的学习中,已经知道,变量作函数的参数,把实参变量的值传递给形参变量。指针变量也可作函数的参数,由于指针变量的值是地址(即指针),因此实参与形参之间传递的是指针,在被调函数中按指针的指向可得到变量的值。下面通过一个例子来说明指针变量作函数的参数时指针传递的过程。第8章 指针对存储信息的引用机制例例8.3 例8.2(输入两个整数,按先大后小的顺序输出)中,用指针变量作

15、参数的函数来实现,并分析参数传递及其处理过程。编程思路:用一个子函数实现交换两个变量的值,主函数中判断两数大小,需要交换时调用子函数,指针变量作函数参数,传递指针。第8章 指针对存储信息的引用机制第8章 指针对存储信息的引用机制第8章 指针对存储信息的引用机制分析:程序运行时先执行主函数,输入2、8,分别赋给变量a、b,两个指针赋值语句使两个指针变量分别指向变量a、b,如图8.3(a)所示。执行if语句,判断ap1,则p2-p1是两个指针之间的元素个数。例如:第8章 指针对存储信息的引用机制8.3.3 通过指针引用数组元素通过指针引用数组元素如何通过指针或指针变量引用数组元素?二者有何区如何通

16、过指针或指针变量引用数组元素?二者有何区别?别?在“数组”一章中已经介绍了“下标法:ai”的形式引用数组元素。通过指针法,即以*(a+i)或*(p+i)形式引用数组元素,将使程序设计更方便和灵活。下面通过例子来说明通过指针引用一维数组元素的方法。第8章 指针对存储信息的引用机制例例8.5 一维数组的输入与输出。下面用4种数组元素的引用方法编写程序,请认真分析并体会数组元素的引用方法与编程技巧。第8章 指针对存储信息的引用机制(1)下标法。第8章 指针对存储信息的引用机制(2)指针法。运行结果同下标法。程序中使用了数组元素指针a+i和指针法引用数组元素:*(a+i)。第8章 指针对存储信息的引用机制(3)指针变量法(使用p+和*(p+)。思考思考:将*(p+)改为*(p+i),影响程序的正确性吗?两个“p=a;”语句的作用是什么?如果去掉第2个“p=a;”语句,程序的执行结果会正确吗?为什么?第8章 指针对存储信息的引用机制(4)指针变量法(使用p+和*(-p)。第8章 指针对存储信息的引用机制分析:显然,程序运行结果以逆序输出。这是因为循环输入后,p指向最后一个元素之后,输出中使用*(

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


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

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