C语言程序设计 教学课件 ppt 作者 蒋清明C语言程序设计__第6章

上传人:w****i 文档编号:94430966 上传时间:2019-08-07 格式:PPT 页数:157 大小:937KB
返回 下载 相关 举报
C语言程序设计 教学课件 ppt 作者  蒋清明C语言程序设计__第6章_第1页
第1页 / 共157页
C语言程序设计 教学课件 ppt 作者  蒋清明C语言程序设计__第6章_第2页
第2页 / 共157页
C语言程序设计 教学课件 ppt 作者  蒋清明C语言程序设计__第6章_第3页
第3页 / 共157页
C语言程序设计 教学课件 ppt 作者  蒋清明C语言程序设计__第6章_第4页
第4页 / 共157页
C语言程序设计 教学课件 ppt 作者  蒋清明C语言程序设计__第6章_第5页
第5页 / 共157页
点击查看更多>>
资源描述

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

1、第6章 指针,返回总目录,目 录,6.1 指针与变量,6.2 指针与数组,6.3 指针与函数,6.5 习题六,6.4 问题与解答,返回总目录,基本要求: )熟悉指针的基本概念、指针变量的定义、引用与运算; )熟悉“指向指针的指针”; )掌握“指针与数组”、“指针与函数”的相关操作。 学习重点: )指针的概念、“指针与数组”、“指针与函数”的相关操作。 ;,6.1 指针与变量,6.1.0 引言,返回目录,学习C语言, 如果你不能用指针编写有效、正确而灵活的程序, 可以认为你没有学好C语言。地址、指针、数组及其相互关系是C语言中最具特色的部分。规范地使用指针, 可以使程序更加简洁明了, 因此, 我

2、们要学会在各种情况下正确地使用指针。,地址的概念与取地址运算,内存按字节编址,每个字节单元都有一个地址。 程序中定义的任何变量,在编译时都会在内存中分配一个确定的地址单元。 我们怎样知道机器将某种数据放在内存的什么地方呢?可用求地址运算符 看出其地址。注意,这个地址并不是始终不变的,这是由系统来安排的,我们无法预先知道。,6.1 指针与变量,6.1.1 指针的基本概念,地址的概念与取地址运算,6.1 指针与变量,6.1.1 指针的基本概念,C语言规定:如果变量占用连续的多个字节,则第一个字节的地址就是该变量的地址。例如定义: short a=10; float b=10; 则编译系统给变量分配

3、的内存空间如图6.1所示。 从图6.1中可以看出,变量a的内存地址为2000,而变量b的内存地址为2002。,地址的概念与取地址运算,6.1 指针与变量,6.1.1 指针的基本概念,程序在引用变量时,首先获得变量的地址,这还只是变量的首地址,然后还要根据变量的数据类型决定要从首地址开始连续取几个字节来获取变量的值。 若定义如图6.1,现程序要获取变量b的值,则先确定变量首地址为2002,然后由变量b的数据类型float知变量占4个字节,所以从首地址开始连续取4个字节的数据即为变量b的值。,指针与变量,6.1 指针与变量,6.1.1 指针的基本概念,使用一个变量可以直接通过变量名,这种方式称为“

4、直接存取方式”。 还可以将变量的地址存入另一“特殊”变量中,然后就可以通过该“特殊”变量来存取变量的值,这种存取变量的方式称为“间接存取方式”。而存放地址的变量就好像存放了一个指针,指向要存取值的变量,故称为“指针变量”。可完整地称为“指向变量的指针变量”。,指针与变量,6.1 指针与变量,6.1.1 指针的基本概念,指针:一个变量的地址 指针变量:专门存放变量地址的变量叫,2000,指针,指针变量,变量的内容,变量的地址,指针变量的定义,6.1 指针与变量,6.1.2 指针变量的定义与引用,指针变量也是变量,在使用之前必须先定义。定义时也可对其赋初值。指针变量的定义格式为: 类型说明符 *指

5、针变量名=初值; 例如: int *p; 定义一个指针变量p,p指向的变量的数据类型为“整型(int)”。,指针变量的定义,6.1 指针与变量,6.1.2 指针变量的定义与引用,在定义指针变量时,应注意以下几点: (1)类型说明符表示该指针变量所指向的变量的数据类型。如int、float、double、char等。 (2)定义指针变量时,指针变量名前必须有一个“*”号, 表示定义的变量是指针变量。 (3)指针变量在定义时允许对其赋初值。如: int a=8; int *p= 需要特别指出的是:这里是用&a对p初始化, 而不是对*p初始化。初始化后指针变量p中存放的是整型变量a的地址,如图6.3

6、所示。,指针变量的定义,6.1 指针与变量,6.1.2 指针变量的定义与引用,int a=8; int *p=,2000,8,指针变量的引用,6.1 指针与变量,6.1.2 指针变量的定义与引用,引用指针变量时常用到下面两个重要的运算符: (1) &:取地址运算符。 如 p = &a;则p即为变量a的地址。“&”号后能接任何类型的变量(包括指针变量)。 (2) *:指针运算符,后面只能接指针变量。用于访问指针变量所指向的变量。或者说,是以运算对象的值作为地址,并返回这个地址所指变量(或内存单元)的内容。 如*p表示访问指针变量p所指向的变量的内容。,6.1 指针与变量,对变量的两种访问方式:

7、直接访问:按变量地址存取变量值 间接访问:通过存放变量地址的变量去访问变量,指针变量的引用,6.1.2 指针变量的定义与引用,例 a=10; -直接访问,10,例 *p=20; -间接访问,20,6.1 指针与变量,指针变量的引用,6.1.2 指针变量的定义与引用,6.1 指针与变量,指针变量的引用,6.1.2 指针变量的定义与引用,6.1 指针与变量,指针移动(和整型表达式进行运算),6.1.3 指针的运算,在使用指针过程中,通过移动指针(P)来实现对不同数据单元的访问操作。对不同的类型,移动的单位长度不同。单位长度一般是指针所指向的变量的数据类型长度。下面是指针参与运算时实现指针移动的三种

8、常用表达式格式: 格式一:P=P+n;(或P=P- n;) 格式二:P+;(或P- - ;) 格式三:+P;(或 - -P;) 其中,n是一个整数,也可以是一个整型表达式。格式一的作用是使指针P向前(或向后)移动n个单位长度;而格式二和格式三的作用都是使指针P向前(或向后)移动1个单位长度。,6.1 指针与变量,指针移动(和整型表达式进行运算),6.1.3 指针的运算,例如定义: short a10, b20, *p= 之后,指针变量p的值不是2000+1=2001,而是2000+2=2002。,6.1 指针与变量,指针赋值,6.1.3 指针的运算,将一个指针变量的值赋给另一个指针变量。结果是

9、两个指针指向同一个地址单元。 例如,int a=10,*p, *q; p = 则指针变量p和q的值都是变量a的地址,也就是说,指针变量p和q指向了同一个变量a,如图6.6所示。,6.1 指针与变量,6.1.3 指针的运算,例6.1 写出下面程序的运行结果。 #include main() int a=10; int *p,*q; p= ,6.1 指针与变量,6.1.3 指针的运算,本程序的一次运行结果如下: 指针p的值为p=fff4(是个地址) 指针p所指向的变量的值为*p=10 指针p的值赋给指针q后,指针q的值为q=fff4 指针p的值赋给指针q后,指针q所指向的变量的值为*q=10 注意

10、:在不同机器上运行时给指针p分配的内存地址是不同的。,6.1 指针与变量,6.1.4 指向指针的指针,若某指针变量中存放的不是(普通)变量的地址,而是另一个指针变量的地址,则该指针变量便被称为指向指针变量的指针变量,可以简称为“指向指针的指针”。 在有些C语言教材中,“指向指针的指针”常被称为“二级指针”,相应的,指向(普通)变量的指针则被称为“一级指针”。 事实上,如果指针变量存放的是数组的地址或函数的地址,则该指针变量便被称为指向“数组”的指针变量或指向“函数”的指针变量。这将在后面的有关章节中进行详细介绍。,6.1 指针与变量,6.1.4 指向指针的指针,二级指针变量的定义(及赋初值)格

11、式为: 类型说明符 *指针变量名=初值; 定义二级指针变量时,应注意: (1) 二级指针变量定义时前面必须有两个“*”号,指向的变量的数据类型由“类型说明符”确定。 (2) 在定义的同时可以赋初值。初值必须是一级指针变量的地址,通常形式为“&一级指针名”。,6.1 指针与变量,6.1.4 指向指针的指针,例如: int a, int *p= 定义了一个整型变量a,一个一级指针p和一个二级指针q,通过赋初值使p指向了a,q指向了p。可通过图6.7来描述这种关系。,6.1 指针与变量,6.1.4 指向指针的指针,由图6.7可知:变量、一级指针与二级指针之间存在以下关系: (1) *二级指针变量:代

12、表所指向的一级指针变量。如:*q就代表p。 (2) *二级指针变量:代表它所指一级指针变量所指向的变量。如:*q代表a。 (3) *一级指针变量:代表它所指向的变量。如:*p代表a。,6.1 指针与变量,6.1.4 指向指针的指针,例 a=10; -直接访问,10,例 *p=20; -间接访问,20,9000,8000,变量q=&p,例 *q=30; -二级间接访问,30,二级指针变量,6.1 指针与变量,6.1.4 指向指针的指针,多级指针,例 三级指针 int *p; 四级指针 char *p;,多级指针的定义与引用跟二级指针相似,由于在实际应用中很少使用,这里不作介绍。有兴趣可以自己编写

13、相应程序进行验证。,6.2 指针与数组,6.2.0 引言,数组在内存中占用连续的存储空间,数组名代表的是数组的首地址。 可定义一个指针变量,通过赋值或函数调用参数传递的方式,把数组名或数组的第1个元素的地址赋值给该指针变量,该指针变量就指向了该数组首元素。 当一个指针指向数组首元素后,对数组所有元素的访问,既可以使用数组下标,也可以使用指针,返回目录,6.2 指针与数组,6.2.0 引言,在本节中,我们首先特别指出指向“数组元素”的指针与指向“数组“的指针这两个概念是有区别的: 如果指针只是指向数组中的某个元素,指针移动是以元素为单位,则该指针便属于指向“数组元素”的指针; 而如果指针指向的是

14、某个数组,指针移动是以数组为单位的,则该指针便属于指向“数组”的指针,6.2 指针与数组,6.2.1 指向数组元素的指针,可以定义一个指针变量,让这个指针变量存储数组中某个“数组元素”的地址,则该指针便指向该“数组元素”。然后通过该指针变量便可对数组中元素进行各种操作。,6.2 指针与数组,6.2.1 指向数组元素的指针,(1)在定义的同时为指针变量赋初值 例如: int a10; int *p = ,1. 使指针变量指向“数组元素”的方法,6.2 指针与数组,6.2.1 指向数组元素的指针,(2)在程序的执行语句部分为指针变量赋值 例如: int a10,b25; int *p, *q; p

15、 = ,1. 使指针变量指向“数组元素”的方法,6.2 指针与数组,6.2.1 指向数组元素的指针,注意:定义指向数组元素的指针变量,其指针类型应与数组元素类型相同。 例如定义: float a10; int *p = 中的第二个语句就是错误的,因为定义的指针p是一个整型指针,它是指向整型数据的,而数组元素是实型数据,类型不相同。编译时虽然只会出现“warning C4133: initializing : incompatible types - from float * to int * ”之类的警告信息,但执行结果却是错误的。所以使用时千万要小心。,1. 使指针变量指向“数组元素”的方法

16、,6.2 指针与数组,6.2.1 指向数组元素的指针,当指针p指向一维数组中某个元素后,可以用指针p访问一维数组的所有元素。,2. 通过指针引用一维数组元素,6.2 指针与数组,6.2.1 指向数组元素的指针,(1) 指向一维数组首元素的指针 假设指针p指向一维数组a的第1个元素a0,则: p+1:使p指向下一个元素a1。 p+i:使p指向元素ai。,2. 通过指针引用一维数组元素,注意: p+1不是将p值简单加1。如果数组元素是短整型(short int),p+1表示p的地址加2;如果数组元素是实型(float),p+1表示p的地址加4;如果数组元素是字符型,p+1表示p的地址加1。 可以使用*(p+i)访问元素ai。 因为p和a都表示数组首地址,所以p+i也可以记作a+i。指向元素ai。 指向数组的指针变量也可以带下标,如,pi与*(p+i

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

最新文档


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

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