C语言程序设计(第二版) 教学课件 ppt 作者 刘克成 张凌晓 ch7

上传人:E**** 文档编号:89381921 上传时间:2019-05-24 格式:PPT 页数:86 大小:1.58MB
返回 下载 相关 举报
C语言程序设计(第二版) 教学课件 ppt 作者 刘克成 张凌晓 ch7_第1页
第1页 / 共86页
C语言程序设计(第二版) 教学课件 ppt 作者 刘克成 张凌晓 ch7_第2页
第2页 / 共86页
C语言程序设计(第二版) 教学课件 ppt 作者 刘克成 张凌晓 ch7_第3页
第3页 / 共86页
C语言程序设计(第二版) 教学课件 ppt 作者 刘克成 张凌晓 ch7_第4页
第4页 / 共86页
C语言程序设计(第二版) 教学课件 ppt 作者 刘克成 张凌晓 ch7_第5页
第5页 / 共86页
点击查看更多>>
资源描述

《C语言程序设计(第二版) 教学课件 ppt 作者 刘克成 张凌晓 ch7》由会员分享,可在线阅读,更多相关《C语言程序设计(第二版) 教学课件 ppt 作者 刘克成 张凌晓 ch7(86页珍藏版)》请在金锄头文库上搜索。

1、1,第7章 指针,7.1 指针的概念 7.2 指针与变量 7.3 指针与数组 7.4 指针与字符串 7.5 指针与函数 7.6 指向指针的指针 7.7 命令行参数 7.8 指针综合应用举例,本章主要内容,2,教学目的 掌握指针、指针变量的概念 理解指针基本运算 掌握指针和变量之间的关系 掌握数组和指针的关系 掌握函数和指针的关系,3,引言,计算机的内存储器被划分为一个个的内存单元,存储单元按一定的规则编号,这个编号就是存储单元的地址。在高级语言程序设计中,内存地址我们称之为指针。 指针是C语言中一个重要的概念,也是C语言的精华部分,它提供了一种较为直观的地址操作手段。正确使用指针,可以有效的描

2、述复杂的数据结构,书写出简洁,高效的程序。,4,7.1 指针的概念,7.1.1 地址与指针 7.1.2 指针变量 7.1.3 指针运算,本节主要内容,5,7.1.1 地址与指针,程序中: int i; float k;,内存中每个字节有一个编号-地址,i,k,为其分配内存单元,变量是对程序中数据 及存储空间的抽象,6,7.1.1 地址与指针,计算机的内存储器被划分为一个个的内存单元。存储单元按一定的规则编号,这个编号就是存储单元的地址。 地址编码的最基本单位是字节(每个字节由8个二进制位组成),也就是说每个字节是一个基本内存单元,对应一个地址。计算机就是通过这种地址编码的方式来管理内存数据,进

3、行读写的准确定位的。,7,在程序中是如何在内存中进行数据的存取?,一是通过变量名,二是通过地址。 程序中不同类型的数据所占用的内存单元数不等 具有静态生存期的变量在程序开始运行前,也就是在编译的时候就已经分配了内存空间; 具有动态生存期的变量,是在程序运行时遇到变量的声明语句时才被分配内存空间的。 在变量获得内存空间的同时变量名也就成为相应内存空间的名称,代表内存中的数据,所以我们可以通过变量名来访问内存空间 但是,有时使用变量名不够方便或者根本没有变量名可用,这时就需要直接用地址来访问内存单元,8,对内存单元的访问管理可以和学生公寓的情况类比,假设每个学生住一间房,每个学生就相当于一个变量的

4、内容,房间就是存储单元,房号就是存储地址。 如果知道了学生姓名,可以通过这个名字来访问该学生,这里相当于用普通变量名访问数据。 如果知道了房号,同样也可以访问该学生,这里相当于通过地址访问数据。 在高级语言程序设计中,内存地址称之为指针,在C语言中 有专门用来存放内存单元地址的数据类型,称为指针类型,9,7.1.2 指针变量 具有指针类型的变量称为指针变量,指针变量是用于存放内存单元地址的;在不会引起混淆的情况下,也将指针变量简称为指针。,指针变量声明: 存储类型 数据类型 * 指针名; 例:int *p; 其中,“*”表示后面声明的变量是指针类型的变量。指针变量一旦被赋值,我们就说该指针变量

5、有了指向。“数据类型”可以是任意类型,指的是指针所指向的对象类型,这说明了指针所指向的内存单元可以用于存放什么类型的数据,我们称之为指针的类型。,区分:int * p1, * p2; 与 int *p1, p2;,10,说明: 在指针变量定义中,*是一个说明符,它表明其后的变量是指针变量,如在 int * p; 语句中,p是指针变量,而不要认为“*p”是指针变量 指针变量定义时指定的数据类型不是指针变量本身的数据类型,而是指针变量所指向的对象(或称目标)的数据类型,指针变量只能指向定义时所规定类型的变量 声明后值不确定,而指针变量一旦被赋值,就有了有效的指向对象 指针变量并不固定指向一个变量,

6、可指向同类型的不同变量 指针变量和普通变量的共同点是:它们都能存放数据,而又有自己的地址。不同的是:普通变量中直接存放通常意义下的数据,而指针变量中存放的是地址。,11,2000,指针,指针变量,变量的内容,变量的地址,指针变量和指针所指向的变量的区别 对于:int i=10, * i_pointer = ,变量的地址,变量的内容,12,7.1.3 指针运算 1. 与指针相关的运算符”*”和”&”,“*”称为指针运算符,也称为取内容运算符,表示指针所指向的变量的值。“*”是单目运算符,其结合性为自右至左。在“*”运算符之后跟的变量必须是指针变量。 需要注意的是指针运算符“*”和指针变量说明中的

7、指针说明符“*”不是一回事。 “&”是取地址运算符,是单目运算符,其结合性为自右至左,其功能是取变量的地址。,13,例如: int i=10, * i_pointer =,i_pointer &i &(*i_pointer) i *i_pointer *(&i),i_pointer = &i = &(*i_pointer) i = *i_pointer = *(&i),i_pointer-指针变量,它的内容是地址量 *i_pointer-指针的目标变量,它的内容是数据 &i_pointer-指针变量占用内存的地址,14,1. 若有定义 int a,*p; 执行了“p=&a”,则: “&*p”的

8、含意是什么?,答:相当于 &a,即p,2. *&a的含意是什么?,答:a,答:a+,3. (*p)+相当于什么?,15,2. 指针的赋值运算 声明了一个指针,只是得到了一个用于存放地址的指针变量。指针变量同普通变量一样,使用之前不仅要定义说明,而且必须赋予具体的值,未经赋值的指针变量一般情况下不能使用 指针变量的赋值只能赋予地址,决不能赋予任何其它数据,对指针赋初值也有两种方法: 在声明指针的同时进行初始化赋值,语法形式为: 数据类型 *指针变量名=初始地址; 在声明后,单独使用赋值语句,语法形式为: 指针变量名=地址;,16,设有指向整型变量的指针变量p,如要把整型变量a 的地址赋予p可以有

9、以下两种方式: (1)指针变量初始化的方法 int a,array10; int *p=,17,需要特别指出的是,给指针变量赋“空”值运算,如: int *p; p=NULL;,因为,从指针变量诞生起到它具有确定的值之前这一段时间,其中的值是随机的,如果误用这个随机的值作为地址去访问内存单元,将会造成不可预见的错误。因此在这种情况下应首先将指针设置为空,说明该指针不指向任何变量。 “空”指针用NULL表示,NULL是在头文件中“stdio.h”定义的符号常量,其值为0。在使用时,应加上#include。 也可以直接用下面的语句给指针赋“空”值。p=0;,18,例 int i, array10;

10、 int *p=,变量必须已说明过 且类型应一致,例 int i; int *p=,用已初始化指针变量作初值, 且必须类型相同,例 main( ) int i; static int *p= (),不能用auto变量的地址 去初始化static型指针,19,3. 指针算术运算,指针可以和整数进行加减运算,但是运算规则比较特殊。前面介绍过声明指针变量时必须指出它所指的数据是什么类型。这里将看到指针进行加减运算的结果与指针的类型密切相关。,比如有指针p1和整数n,p1+n表示指针p1当前所指位置后方第n个数的地址,p1-n表示指针p1当前所指位置前方第n个数的地址。 p1+或p1-表示指针p1当前

11、所指位置下一个或前一个数据的地址。,20,一般来讲,指针的算术运算和数组的使用是相联系的,因为只有在使用数组时,才会得到连续分布的可操作的内存空间。 并且,对指针进行算术运算时,一定要确保运算结果所指向的地址是程序中分配使用的地址。,21,4. 指针关系运算 指针变量的关系运算指的是相同类型数据的指针之间进行的关系运算,如果两个相同类型的指针相等,就表示这两个指针指向同一个地址 例如p和q是两个同类型的指针变量,则pq,p=q,p!=q都是允许的。在执行pq的运算时,其含义为如果p所指元素在q所指元素之前,则表达式结果为真。 指针的关系运算在指向数组的指针中广泛的运用 注意:指针在进行关系运算

12、之前,必须给其赋值,即有确定的指向。不同类型的指针之间或指针与非0整数之间的关系运算是毫无意义的。,22,7.2 指针与变量,通过指针变量给所指向的变量赋值 通过改变指针变量的指向来访问不同的变量 通过指针变量来改写所指向的变量的值,本节主要内容,23,在定义一个指针变量以后,我们就可以用该指针变量指向一个已经存在的变量,通过指针变量对该内存存放的数据进行读写。 通过指针变量给所指向的变量赋值,例7.1: int main() int *p1,*p2, a,b; scanf(“%d,%d”, ,运行结果: 3,4 3,4,程序中定义了两个指针变量p1,p2和两个整型变量a,b。系统会给a,b分

13、配内存空间,通过scanf()取得数值,然后通过赋值语句使p1指向了a,p2指向了b,见图7.3。,24,2. 通过改变指针变量的指向来访问不同的变量,例7.2 int main() int *p1,*p2,*p,a,b; scanf(“%d,%d”, ,运行结果为: 3,4 3,4 4,3,可以讨论一下:为什么*p1,*p2在两次输出时不一样?,25,3.通过指针变量来改写所指向的变量的值,例7.3 int main() int *p1,*p2, a,b,temp; scanf(“%d,%d”, ,运行结果为: 3,4 3,4 4,3,讨论一下:两个指针的指向是否改变?指向的内存空间的值是否

14、该变?,26,7.3 指针与数组,7.3.1 指针和一维数组 7.3.2 指针和二维数组 7.3.3 指针数组,本节主要内容,27,指针变量可以指向基本类型的变量,还可以指向其它数据类型的变量,最常用的是指向数组及其元素。 指针加减运算的特点使得指针特别适合处理存储在一段连续内存空间中的同类数据,而数组恰好是具有一定顺序关系的若干同类型变量的集合体,数组元素的存储在物理上也是连续的,数组名就是数组存储的首地址。 这样,便可以用指针来对数组及其元素方便而快速的操作。,28,首先定义一个一维数组和一个指针变量,例如: char array10=1,2,3,4,5,6,7,8,9,10,*p; 当p

15、=array时,就使得p指向了array数组的第一个元素,那么p与数组array的关系就如图7.4所示了。,7.3.1 指针和一维数组,29,数组名array是数组的首地址,则array+1是数组元素array1的地址,与&array1等价;同样当p指向数组array的首地址后,p+1代表array1的地址。所以,&arrayi、array+i、p +i都是数组元素arrayi的地址。 由于本例array是字符型数组,每个元素占1个字节,假定首地址为1000,则&arrayi、array+i、p +i的地址值为array+i*1。,在C编译系统中还允许将*(p+i)直接以pi形式表示。,由此可

16、见如下的等价关系成立: p=array=&array0 /*表示数组元素的首地址*/ p+i=array+i=&arrayi /*表示第i个数组元素的地址*/ *(p+i)=*(array+i)=arrayi /*表示第i个数组元素*/,30,所以,通常访问数组元素有三种方式: 下标法:数组名下标 首地址法:*(首地址+偏移量) 指针变量法:*指针变量,31,例7.4分别用三种方式访问数组中的所有元素。 #include int main() int i,array10=1,2,3,4,5,6,7,8,9,10,*p; printf(“NO1: “); for(i=0;i10;i+) printf(“array%d=%d,“,i,arrayi); printf(“nNO2:n

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

最新文档


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

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