C语言程序设计 教学课件 ppt 作者 曹玲焕 孙萍主编 第八章

上传人:E**** 文档编号:89381631 上传时间:2019-05-24 格式:PPT 页数:40 大小:564KB
返回 下载 相关 举报
C语言程序设计 教学课件 ppt 作者 曹玲焕 孙萍主编 第八章_第1页
第1页 / 共40页
C语言程序设计 教学课件 ppt 作者 曹玲焕 孙萍主编 第八章_第2页
第2页 / 共40页
C语言程序设计 教学课件 ppt 作者 曹玲焕 孙萍主编 第八章_第3页
第3页 / 共40页
C语言程序设计 教学课件 ppt 作者 曹玲焕 孙萍主编 第八章_第4页
第4页 / 共40页
C语言程序设计 教学课件 ppt 作者 曹玲焕 孙萍主编 第八章_第5页
第5页 / 共40页
点击查看更多>>
资源描述

《C语言程序设计 教学课件 ppt 作者 曹玲焕 孙萍主编 第八章》由会员分享,可在线阅读,更多相关《C语言程序设计 教学课件 ppt 作者 曹玲焕 孙萍主编 第八章(40页珍藏版)》请在金锄头文库上搜索。

1、1,第 八 章,指 针,2,一、指针及其定义 二、指针的运算 三、指针和变量 四、指针和数组 五、指针和字符串 六、指针和函数,主要内容:,end,3,一、指针及其定义,指针 指针:指针是一种数据类型,它是一个变量在内存中所对应单元的地址。指针变量是存储另一个变量的地址的变量,也就是存放地址的变量。 指针变量:保存其他变量地址的变量就称为指针变量。因此,我们可以认为:指针是用于指向其他变量的变量。,4,1.数据在内存中的存储、读取过程 例如:整型变量 i , j , k ; 在编译时为变量分配内存,内存示意图如图 1 所示.,(2) 给变量赋值为 i=3; j=6; k=9;,(1) 假设变量

2、 i,j,k 被分配的 内存地址分别为2000,2002,2004,(3) 通常,在程序中通过变量名对变量 进行存取。,其实程序经过编译后已将变量名转换为变量的地址,对变量值的存取都是通过变量的地址进行的。,图1,5,(1) 直接访问方式 按变量地址存取变量值的方式。 如果读取变量 i的值,直接到为变量i分配的存储单元(2000、2001字节)中取出i的值(3)即可。,(2) 间接访问方式 先将变量 i 的地址存放在另一个变量p中,如果读取变量 i的值,先找到变量p,从p中取出内容(2000,即变量i的起始地址),然后到2000、2001字节中取出i的值(3)。 即通过变量p访问为变量i分配的

3、内存单元。,访问变量的两种方式:,6,直接访问示意图,间接访问示意图,表示将数值3送到变量i中,可有两种表达方法: (1)将3送到变量i所标志的单元中。即直接访问方式 (2)将3送到变量p所指向的单元(变量i)中。 即间接访问方式,注意:我们并不关心变量p的存储地址, 对 变量p的访问属于直接访问。,7,2 指针的定义,指针变量与一般变量一样,必须先定义后使用。指针变量定义的一般形式为: 数据类型 *指针变量名,*指针变量名,; 例如: float *p; /* 说明p为指向实型变量的指针变量 */ int x, *px; /* 说明了整型变量x和指向整型变量的指针变量px */,8,3 指针

4、的初始化,在定义指针变量的同时赋给其初始值,让指针变量指向一个具体的变量,称为指针初始化。指针初始化的一般形式如下: 数据类型 *指针变量名 = 初始地址值 ; 例如: int a,*pa=,9,()把一个变量的地址作为初始值赋给指针变量时,该变量在指针初始化前必须定义过。因为变量在定义后系统才为其分配内存空间,地址才能确定下来。没定义的变量,其地址无法确定。 ()指针指向变量的数据类型必须和指针的基类型一致。 如:double y; double *p= / * 把指针变量pc中的地址值赋给指针变量qc*/ 这样,使得指针变量pc和qc都指向了变量c。 (4)可以给指针变量初始化为空指针。

5、例如:int *p=0;或int *p=NULL; 这里NULL是在stdio.h中定义的符号常量,其代码值为0,这时,p并不是指向地址为0的存储单元,而是说p不指向任何存储单元。,说 明:,back,10,二、指针的运算,(一)引用运算 (二)指针的算术运算 (三)指针的赋值运算 (四)指针的关系运算,11,(一)引用运算,当指针变量定义并指向确定的内存单元之后,引用变量的方式可以用变量名直接引用,也可以通过指向变量的指针间接引用。 间接访问运算符“*”又称取内容运算符。用于获取地址对应的存储单元的内容。*和&的优先级相同,结合性为右结合。对指针变量进行取内容运算,可以得到指针变量所指向对象

6、中的数据。,例如;int i=100,j,*pi= /*这里的括号可以省略*/ +与* 运算优先级相同,结合性自右至左。,12,(二)指针的算术运算,在第六章中我们已经知道数组在内存中占据一片连续的存储单元,并且数组名代表这片存储单元的首地址。假设指针p指向数组中的某个元素,n为一个正整数,则表达式:p+n指向当前元素之后的第n个元素。而表达式:p-n指向当前元素之前的第n个元素。 最常见的指针加减运算是指针向后或向前移动一个元素,p+的含义是:指针加1,指向数组中的下一个元素;p-的含义是:指针减1,指向数组中的前一个元素。指针与整数进行加减运算后,它们的相对关系如图,指针当前位置,由于指针

7、p所指的具体对象类型不同,每个存储单元所占字节数不同,所以指针增、减1时,不简单代表地址加、减数值1,而是指1个存储单元,1、指针与正整数的加减运算,13,. 两个指针的减法运算,只有当两个指针指向同一数组中的元素时,才能进行两个指针的减法运算,否则,没有意义。当两个指针指向同一数组中的元素时,p-q表示指针p和q所指对象之间的元素个数。 利用这一原理,可以求出一个字符串的长度。,#include main( ) char str50, *p=str; printf(“Enter string:“); gets(str); while (*p) p+; /* 找到串结束标记0。退出循环时p指向

8、0 */ printf(“String length=%dn“,p-str); /*指向同一数组的两个指针进行减法运算,求出串长*/ ,例:指针相减求字符串长度,14,(三)指针的赋值运算,把一个变量的地址赋予指向相同数据类型的指针变量。 例如:int a,*pa;pa= 把标准函数获得的地址值赋给指针变量,15,(四)指针的关系运算,指向同一数组的两指针变量p1、p2进行关系运算可表示它们所指数组元素之间的关系。,p1=p2表示若p1和p2指向同一数组元素时为真,否则为假。 p1!=p2表示若p1和p2不指向同一数组元素为真,否则为假。 p1p2表示若p1处于高地址位置时为真,否则为假。 p

9、1=p2表示若p1处于高地址位置或与p2指向同一元素时为真,否则为假。 p1p2表示若p1处于低地址位置时为真,否则为假。 p1=p2表示若p1处于低地址位置或与p2指向同一元素时为真,否则为假。,指针变量还可以与0比较。设p为指针变量,若p=0成立,则表示p是空指针,它不指向任何变量;若p!=0成立,则表示p不是空指针。对指针变量赋0值和不赋值是不同的。指针变量未赋值时,可以是任意值,是不能使用的。否则将造成意外错误。而指针变量赋0值后,则可以使用,只是它不指向具体的变量而已。,例如:,16,例:编写程序将一个字符串反向。,分析:将字符串放在字符数组str中,两个指向字符的指针p和s,让s指

10、向第一个字符,p指向最后一个字符,在(sp)情况下,反复执行s和p所指的内容交换,s指针向后移动,p指针向前移动。这样来实现字符串反向。,#include main( ) char str50, *p, *s, c; printf(“Enter string:“); gets(str); p=s=str; /* 指针p和s指向str */ while (*p) p+; /* 找到串结束标记0 */ p-; /* 指针回退一个字符,保 正反向后的字符串有串结束标记0, 指针p指向字符串中的最后一个字符 */ while (sp) /* 当串前面的指针s(小于) 串后面的指针p时,进行循环 */

11、c = *s; /* 交换两个指针所指向的字符 */ *s+ = *p; /* 串前面的指针s向后(+1)移动 */ *p- = c; /* 串后面的指针p向前(-1)移动 */ puts(str); ,back,17,三、 指针和变量,1.变量的指针 变量的地址称为变量的指针。 2. 指针变量 存储变量地址的变量称为指针变量,用来指向另一个变量。 3. * 操作符 为了表示指针变量与它所指向的变量的之间的关系,在程序中用 * 符号表示“指向”。,例如,P代表指针变量,* P则表示P所指向的变量。,以下两个语句作用相同: i=3; *P=3;,18,4.指针变量的定义,int i , j ;

12、int *pointer1, *pointer2;,定义形式: 基类型 *指针变量名;,举例,说明,(1)指针变量名前的*,表示该变量是指针型的变量。指针变量名为pointer1,而非 *pointer1。,(2)定义指针变量时必须指明基类型。,*注:以后几张幻灯片中提到的pointer1 pointer2是基于此例的。,19,如何使一个指针变量指向一个变量呢?,使用取地址运算符 ,赋值语句pointer1=&i;实现将变量i的地址保存入指针变量pointer1中。如右图所示。,你能画出第二个赋值语句的示意图吗?,5.指针运算符 &,20,6.指针变量的引用,与指针变量有关的两个运算符: &

13、: 取地址运算符 * :间接访问运算符,(1)上例将打印出i的值。 (2)*pointer1 与普通的整型变量一样使用,但前提是pointer1 必须已经明确地指向了某整型变量,或者说指针变量中必须已经存有了某整型变量的起始地址。,例如,i=3; pointer1=,说明,21,例1: 输入两个整数,按先大后小输出这两个整数,#include void main() int *p1, *p2, *p,a,b; scanf(“%d%d“, ,你能画出程序中指针处理过程的示意图吗?,22,7.指针变量作为函数参数,函数的实参值是地址,函数的形参应定义为指针类型,此时,实参和形参之间仍然是传值方式。

14、参见例2。,#include void swap(int *p1, int *p2) int temp; temp=*p1; *p1=*p2; *p2=temp; void main() int a,b,*pointer1, *pointer2; scanf(“%d%d“,/* 打印函数调用后,变量a,b的值,观察其变化*/ ,在被调函数中,通过间接访问, 改变了主调函数中实参变量的值。,变量a,b的地址被传递 到函数的形参变量p1,p2中,back,23,四、指针和数组,数组在内存中占一片连续的存储区,该存储区的大小与数组的元素类型和数组长度有关。 每个数组元素占用相同大小的存储空间。 利用

15、数组存储区的起始地址,可以逐个获得每个数组元素的存储地址。,例如,定义数组 int a10;,1.数组的存储,a0 a1 a2 a3 a4 a5 a6 a7 a8 a9,注:假设数组a的存储区起始地址为2000。,2000,2002,2004,2006,2000+4*2,2000+9*2,由上图可知,数组元素ai的存储地址的计算公式为: 数组a的起始地址+i元素类型占内存的字节数,图2,24,C语言规定: 数组名代表数组的起始地址,该地址在程序运行过程中不能修改。 即数组名a是个常量。,2.指向数组元素的指针,例如, int a10; int *p;,对指针变量p赋值:p= 则使p指向了数组的第一个元素。,因此,下面对指针变量p赋值的两个语句等价: p=,因此定义指向数组的指针变量时,可以对其初始化: int a10; int *p=a; (或 int *p=&a0; ),25,例如,定义:int a10 ,*p=a; 可有如下操作: p=a;

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

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

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