C语言程序设计 教学课件 ppt 作者 丁峻岭 等 第九章

上传人:E**** 文档编号:89381911 上传时间:2019-05-24 格式:PPT 页数:143 大小:1.31MB
返回 下载 相关 举报
C语言程序设计 教学课件 ppt 作者 丁峻岭 等 第九章_第1页
第1页 / 共143页
C语言程序设计 教学课件 ppt 作者 丁峻岭 等 第九章_第2页
第2页 / 共143页
C语言程序设计 教学课件 ppt 作者 丁峻岭 等 第九章_第3页
第3页 / 共143页
C语言程序设计 教学课件 ppt 作者 丁峻岭 等 第九章_第4页
第4页 / 共143页
C语言程序设计 教学课件 ppt 作者 丁峻岭 等 第九章_第5页
第5页 / 共143页
点击查看更多>>
资源描述

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

1、第9章 指针,9.1 地址和指针 9.2 一维数组的指针表示方法 9.3 二维数组的指针表示方法 9.4 函数参数与指针、数组 9.5 返回指针值的函数 9.6 指向函数的指针变量 9.7 指针与字符串 9.8 指针数组 9.9 指向指针的指针 9.10 main函数中的参数 9.11 指针数据小结 课后练习,指针的定义与运用是C语言的一大特色,也是其能够得到广泛应用的重要原因之一。指针可以作为数组的地址,从而使数组的处理变得简洁;可以通过指针传递变量的地址给函数,从而实现调用函数后返回多个值;另外,指针还支持动态内存分配,使处理数值、字符数组的方法更为简单。,9.1 地址和指针 9.1.1

2、指针概述 1变量的“直接访问”方式 凡在源程序中定义的变量,在编译时系统都给它们分配相应的存储单元,每个变量所占的存储单元都有确定的地址。具体的地址是在编译时分配的。例如: short a=1,b=2; float c=3.4,d=5.6; char e=x,f=y;,以前要访问内存中的变量,是通过变量名来引用变量的值。实际上,编译时每一个变量名都对应一个地址,在内存中不再出现变量名而只有地址。程序中若引用某变量,则系统找到其对应的地址后从中取出其值。 例如scanf(“%d”,&b),其中的&b指的是变量b的地址。执行scanf函数时,将从键盘输入的一个整数送到&b所标志的存储单元中。 可以

3、看到要访问变量,C系统必须按该变量的地址找到该变量的存储单元。因此可以说一个地址“指向”一个变量的存储单元。譬如说,地址1010指向变量a、1012指向变量b、1014指向变量c等。这种通过变量名或地址访问一个变量的方式称为“直接访问”方式(实际上通过变量名访问也就是通过地址访问)。,2变量的“间接访问”方式 “间接访问”方式就是把一个变量的地址放在另一个变量的存储单元中。如图9-2所示。,图9-2 将变量的地址放在另一个变量的存储单元中,变量pa、pb分别用来存放变量a、b的地址(即&a、&b)。要得到变量a的值,可以先访问变量pa,得到变量pa的值1010后,再通过地址1010找到它所指向

4、的存储单元中的值。这种把地址存放在一个变量中,然后通过先找出地址变量中的值(一个地址),再由此地址找到最终要访问的变量的方法,称为“间接访问”方式。,3指针概念的引出 通过用一个地址变量存储某一普通变量的起始地址,进而指向一个普通变量。可以将它形象地表示为如图9-3所示的逻辑关系。,图9-3 指针指向变量,一个变量的地址称为该变量的“指针”。例如,地址1010是变量a的指针。存放地址的变量叫“指针变量”。从图9-3可以看到,pa是指针变量,因为pa中存放着变量a的地址,称为pa指向变量a,通过变量pa就能找到a的值。请区分“指针”和“指针变量”这两个概念,指针是一个地址,而指针变量是存放地址的

5、变量。,9.1.2 指针变量的定义 定义指针变量的语句和定义其他变量或数组的语句格式基本相同,定义的同时,可以给其赋初值。具体格式为: 数据类型 *指针变量名1; (1)定义一个指针变量时,必须在一个变量名前加指针说明符“*”。注意,指针变量名本身不含“*”号。 (2)在定义了一个指针变量后,系统为之分配一个存储单元,这个存放指针变量的存贮单元一般都占有固定的字节(如16位机2个字节)。 (3)相同类型的指针变量和普通变量,可以放在一起说明,如: float f,*pf; int *pi,i; (4)指针变量和普通变量完全一样,由它的定义位置决定指针的作用域和生命期。,(5)定义指针变量后,该

6、指针变量并未指向确定的变量。要想使一个指针变量指向一个确定的变量,必须将确定变量的地址赋给该指针变量。例如: int *p,i=3; p= /*pf为指向float型变量的指针*/,9.1.3 指针变量的引用 1“ /*运行结果为:1.23,1.23*/,2使用指针运算符应注意的问题 (1)指针变量定义中“*”运算符应注意的问题。 对于下面两个语句: int a,*p=”两个语句是等效的。,3对指针变量的操作 在定义了一个指针变量之后,比如: int *p,a; 我们就可以对该指针进行以下各种操作。 (1)给一个指针变量赋予一个地址值。 p= /*将指针变量p所指向的变量的值输出*/,4指针变

7、量的应用举例 【例9.1】使两个指针指向同一个变量。 main() int a,b,*p1= 运行情况如下: 输入:1,2(回车) 显示:1,2 显示:1,1,【例9.2】使两个指针变量交换指向。 main() int a=1,b=2,*p1= 运行情况如下: a=2,b=1 return,9.2 一维数组的指针表示方法 9.2.1 一维数组的地址表示法(地址法) 在程序中定义一个数组后,编译系统就会为它分配一个可以容纳数组中所有元素的存贮区,其中数组名代表这个数组的起始地址。那么在C语言中,数组各元素的地址是如何表示和计算的呢?下面讨论一下一维数组的地址表示法。 定义一个含有5个元素的一维数

8、组a如下: int a5=1,3,5,7,9; 它在内存中的分配情况如图9-4所示。,对于上面定义的数组,a的值就是数组a的起始地址(假设为1010),由于已定义数组a为整型数组,则a0的地址值也是a的值(1010),a1的地址可以用a+1表示,也就是说a+1指向数组a中下标为1的元素。同样,a+i是ai的地址。需要说明的是:在编译系统计算实际地址时,a+i中的i要乘上数组中每个元素所占的字节数,即:a+i*n(n为一个元素所占的字节数)。例如: a+1的实际地址为:1010+1*2=1012 a3的实际地址为:1010+3*2=1016 或者说,a+i和&ai的含义是等价的,都是指ai的地址

9、。要注意区分ai与&ai二者的不同含义,ai是a数组第i个元素的值;而&ai是ai元素的地址。,引用一个数组元素,可以用两种不同的方法。一种是前面已经介绍的下标法,即指出数组名和下标值,系统就会找到该元素,如a3就是用下标法表示的数组元素。另一种是地址法,即通过相应的地址访问数组的某一元素。例如,通过a+3的地址可以找到a3元素,*(a+3)就是a3元素的值。因此下面二者等价: ai /*下标法*/ *(a+i) /*地址法*/ 都是指a数组中序号为i的元素值。,9.2.2 一维数组的指针表示法 数组名本身是数组的首地址,它的位置是固定的,是个常量值。如果我们定义一个指针变量,并把这个指针指向

10、该数组的起始地址,那么通过对指针的运算,就可以完成对数组的访问,这种方法被称为指针法。例如: int a5=1,3,5,7,9,*ip; ip=a; /* *ip就是元素a0的值,它等同于 ip=)*/,【例9.4】分别用下标法、地址法、指针法访问数组元素。 #include main() int a5=1,3,5,7,9,i,*p; for(i=0;i5;i+)printf(“%d ”,ai); /*下标法*/ printf(“n”); for(i=0;i5;i+)printf(“%d ”,*(a+i); /*地址法*/ printf(“n”); for(p=a;pa+5;p+)printf

11、(“%d ”,*p); /*指针法*/ 通过上面的例子可以看出,用3种方法都能得到数组各个元素的值。 注意,试图用下面的方法输出数组a中5个元素是不行的。 for(i=0;i5;i+) printf(“%d“,a+); 错误之处在于,a的值是数组首地址,是一个固定的常数。,9.2.3 使用指针法应注意的问题 (1)在下标法、地址法、指针法3种方法中,指针法的效率最高。虽然使用下标法和地址法同指针一样,能够输出同样的结果,但它们的效率是不同的。采用下标法访问数组元素时,要先将ai转换成*(a+i),即先计算出数组元素的地址,然后再找到它指向的存储单元,读出或写入它的值;而用指针变量p指向数组元素

12、时,则不必每次计算数组元素地址。特别是像p+这样的操作是比较快的。 (2)在使用指针访问数组元素时,是完全根据地址来访问元素的,系统不作“下标是否越界”的检查。 (3)使用指向数组元素的指针变量时,应当注意指针变量的当前值。例如: p=a; for(i=0;i5;i+)scanf(“%d“,p+); 它的功能是想向数组a中的5个元素输入值,但是如果少写了第一个赋值语句“p=a;”,那么p的值将是一个不确定的值,所以它的指向将是不确定的,这就有可能将输入的5个整数输入到难以预料的存储单元中去,从而会破坏系统的正常工作状态。,9.2.4 应用指针法举例 【例9.5】从键盘输入若干天的温度值,求平均

13、温度。要求用数组存放输入的若干个温度值,当输入完全部需要处理的温度值后,输入“0 ”表示输入结束,然后对已输入的温度求平均值。 用地址法编写程序如下: main() float t31,s=0; int n,d=0; /*d为输入数据计数值,n为实际输入的有效数据量*/ do printf(“请输入第%d天的温度值:“,d+1); scanf(“%f“,t+d); while(*(t+d+)!=0); n=d-1; /*剔除输入的0*/ for(d=0;dn;d+)s+=*(t+d); /*统计n个数据的和值*/ printf(“平均温度为:%4.1f“,s/n); ,程序中,当使用dowhi

14、le循环结构以while(*(t+d+)!=0)判别结束标志时,实际输入的有效数据n=d1(请自行分析)。此外请注意区分下面两个式子: *(t+d+)与(*(t+d)+) 后者表达式是对t+d单元中的内容增1。 可以用指针法改写上述程序,改动后的源程序如下: main() float t31,s=0,*p=t; int n,d=0; /*d为输入数据计数值,n为实际输入的有效数据量*/ do printf(“请输入第%d天的温度值:“,+d); scanf(“%f“,p); while(*(p+)!=0); n=d-1; /*剔除输入的0*/ for(p=t;pt+n;p+)s+=*p; /*

15、统计n个数据的和值*/ printf(“平均温度为:%4.1f“,s/n); 以上两个程序,虽然程序的结果相同,但事实上第二个程序执行速度比第一个要快些。,9.2.5 指针变量的运算 1指针变量运算的特点 从前面的学习知道,指针变量是一种指向特定元素(地址)的变量,既然属于变量,那么自然可以进行变量的操作。但由于指针变量本身存放的是面向内存的某个地址,所以有关指针变量的运算是很有限的。一般来说,在C语言中允许指针变量进行的运算包括: (1)增1运算。 (2)减1运算。 (3)指针变量与整数的加减运算。 (4)指针变量的相减运算。 (5)指针变量的比较运算。 这是容易理解的,指针变量作为一个内存的地址变量,诸如乘、除、移位、相加,以及与浮点数的相加或相减操作显然是没有任何实际意义的。,指针变量运算是一种地址运算,它的运算还与地址中存放的元素的长度(数据长度)有关。指针变量运算中一个很重要的特点是,指针变量加1,并不是指针变量所在的地址加1,而是指该指针变量所指的变量的地址加1个数据长度。例如: char c,*cp= /*在dp所存放的地址值上加8个字节*/ 其实,凡是有关指针变量的算术运算,均是根据指针变量的具体类型而进行相应操作的。,2指针变量的增1、减

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

最新文档


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

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