C语言程序设计 第二版 教学课件 ppt 作者 钟廷志 李如超 第8章

上传人:E**** 文档编号:89351040 上传时间:2019-05-23 格式:PPT 页数:42 大小:129.50KB
返回 下载 相关 举报
C语言程序设计 第二版  教学课件 ppt 作者  钟廷志 李如超 第8章_第1页
第1页 / 共42页
C语言程序设计 第二版  教学课件 ppt 作者  钟廷志 李如超 第8章_第2页
第2页 / 共42页
C语言程序设计 第二版  教学课件 ppt 作者  钟廷志 李如超 第8章_第3页
第3页 / 共42页
C语言程序设计 第二版  教学课件 ppt 作者  钟廷志 李如超 第8章_第4页
第4页 / 共42页
C语言程序设计 第二版  教学课件 ppt 作者  钟廷志 李如超 第8章_第5页
第5页 / 共42页
点击查看更多>>
资源描述

《C语言程序设计 第二版 教学课件 ppt 作者 钟廷志 李如超 第8章》由会员分享,可在线阅读,更多相关《C语言程序设计 第二版 教学课件 ppt 作者 钟廷志 李如超 第8章(42页珍藏版)》请在金锄头文库上搜索。

1、第8章 指针,本章主要讲述C语言中的又一重要概念指针。指针是语言中的重要概念,也是语言的重要特色。计算机在执行程序时,60%70%的时间都是用于寻找地址,因此,引入指针变量可以直接对内存中的不同数据进行快速处理。 使用指针为函数间的各类数据(特别是复杂数据类型的数据)在函数之间的传递提供了简洁便利的方法,可以使程序更加简洁、紧凑、高效。因此,只有正确、灵活地使用指针,才能够编写出简洁明快、功能强大、质量高的程序。,【学习目标】, 掌握指针的概念、定义 掌握指针变量的使用 掌握指针在函数中的运用 掌握指针的运算 掌握指针在数组中的运用,8.1 概述,计算机最基本的功能之一就是具有记忆功能,计算机

2、记忆数据的基本方法是将其转换为二进制后存放在存储器中。 存储器由数量巨大的一个个存储单元组成,为了便于管理,必须给每个单元编号,该编号通常由十六进制数表示,称为地址码,或简称地址。它类似于一座宾馆内每个房间的门牌号。C程序中的变量都存储在具有确定地址的存储单元中。,指针的本质就是地址,指针变量是一种专门用来在存储器中存储地址的特殊变量。在第6章函数中,已提到访问某个数据其实质是先找到存放这个数据的存储单元(地址),然后再找到这个地址中所存储的数据。有了指针这一概念后,就可以先使指针变量指向某个变量的地址,然后通过对指针的操作实现对这个变量的操作。这种操作尤其是针对数组、结构体等复杂数据类型时非

3、常简便。引入指针后:, 可以使程序实现简洁化、紧凑化和高效化; 为函数之间提供简洁而便利的参数传递方法; 可以实现动态分配存储空间; 可以使程序员浏览整个内存空间从而能够改变内存中的数据。,任何事物都具有两面性,指针的优点虽然很多,但对指针的操作又是一项颇具“危险性”的工作。不正确地使用指针可能将数据错误地写到别的存储单元,覆盖不应该覆盖的值,造成严重的数据损失,甚至可能使整个软件系统不能正常工作。由此可见,在使用指针时,必须深刻领会其设计要领。,8.2 指针的定义,指针总是和地址分不开的,从某种角度来说,指针就是地址。因此在介绍指针概念之前,首先讲述地址的概念。,1地址的概念,计算机中的地址

4、与现实生活中的地址非常相似,如图8-1所示。例如,在一幢学生宿舍里,每1个房间都有1个编号,以便于别人访问该房间里居住的同学;在计算机的内存中,每1个存储单元(1个字节的存储空间)同样也有1个编号,以便于计算机访问该内存单元中的数据,这个编号就是存储单元的地址。在内存单元中存储的数据就像房间里居住的学生,通过房间门牌号码可以找到该房间居住的学生,同样,通过内存单元的地址可以实现对存储在该单元中数据的读写操作。,2指针的定义,(1)指针的定义格式 既然指针变量是一种特殊的变量,因此在使用之前也必须先定义。 指针的定义格式如下: 指针类型 *指针变量名;,对指针定义做以下说明。 指针类型是指指针所

5、指向变量中存放数据的类型。 指针变量名是指针的名字,它遵循标识符的命名规则。 “*”符号可以靠近定义中任何1个部分,甚至也可以独立地放在中间,在这里“*”主要起一个标识作用,用于说明定义的变量为指针变量。,(2)应用举例 定义1个指向整型变量的指针变量p: int *p; 定义1个指向实型变量的指针变量q: float *q; 定义1个指向字符型变量的指针变量point: char *point; 此外,还可以同时定义多个相同类型的指针,例如: int *p,*q;,3指针变量的操作,在对指针的实际运用中,经常会用到以下操作: 对指针变量赋地址,即指针的初始化; 利用指针可以间接访问变量。,由

6、于指针是一种存放变量地址的特殊变量,因而为指针初始化的方法就是将1个变量的地址赋给1个指针变量。 (1)取地址运算符“&”。在C程序设计中,1个变量在内存中存放时具有确定的地址,但是对于程序设计者来说,具体地址是多少并不重要。使用取地址运算符“&”可以获得1个变量在内存中的地址。,例如,设有一个整型变量a,则“”的功能是把整型变量a,b的地址赋给指针变量p,q,这就是对指针变量的赋值操作。,(3)取内容运算符“*”。在指针的前面添加“*”运算符可以获得该指针所指向变量的值,因此将“*”运算符称为取内容运算符。,当将一个指针指向一个变量后,使用“*”可以实现对变量的间接访问。例如: int a,

7、b,*p; /*定义变量和指针*/ a=10; /*变量的初始化*/ p= /*将指针所指向变量的值赋给变量b*/,在语句“b=*p;”中,使用取内容运算符“*”获得指针p所指向的变量的值,也就是变量a的值,因此该语句与“b=a”等效。由于使用指针作为数据访问的中介,因此,将使用指针对变量的访问称为对变量的间接访问。,使用间接访问的方法不但可以将数据读出,还可以将数据写入,例如: b=*p; /*数据读出将指针所指向变量的值赋给变量b*/ *p=b; /*数据写入将变量b的值赋给指针所指向变量*/ 实际上语句“*p=b;”与语句“a=b”等效。,正因为如此,可以在指针定义的同时对其进行定向,例

8、如: int a,b,*p /*先定义指针*/ p&a; /*后定向指针*/,此外,*”是1个输出语句,其实质为通过指针变量对其指向的变量的值的查询或引用。该语句与“printf(“n %d %d“,a,b);”等效。,(4)除了给指针赋1个确定的地址外还可以为指针赋1个“空”值,这时该指针并没有指向1个确定的地址,例如: p=NULL; 或者: p=0; 或者: p=0;,(5)在C语言中,虽然在定义1个变量后系统就为该变量在内存中分配了一定大小的存储空间。但究竟此单元的地址是多少,用户是很难知道的。其实,在实际的操作中,通常并不需要知道1个变量在内存中的地址编号是多少,在程序中只需用相应的

9、表达式表示出1个变量的地址即可,例如使用语句:“p=”。,8.3 指针变量作函数参数,指针与数组一样,可以作为函数的参数使用,本节将重点讲解指针在函数中的应用。 函数的参数不仅可以是整型、字符型和实型等基本数据类型的变量,还可以是指针类型。使用指针作为函数的参数更能体现函数的特点,增加程序设计的灵活性,增强函数的功能。使用指针作为函数参数实质上是采用地址传递的方式,将1个变量的地址传到另一函数中。,1、使用指针作为函数参数改写案例8-2的程序。,2使用指针作为函数参数用法小结,(1)和基本函数调用一样,指针应该在使用之前先定义,至少应在使用之前加以声明;否则在执行程序时系统要出现错误提示,程序

10、不能编译通过。 (2)不能企图通过改变指针形参的值而使指针实参的值改变,也就是说不能通过修改形参的指向来改变实参指针的指向。C语言中实参变量和形参变量之间的传递是单向的“值传递”方式,指针变量作为函数参数也要遵循这一原则。虽然在调用函数时不能改变实参指针变量的值,但可改变实参指针变量所指变量的值,这正是指针参数的优势所在。,(3)在本程序中,在主函数中还可以省略指针变量t1和t2,也可以达到同样的设计目的,完整的程序如下:,8.4 指针变量作函数参数,指针变量不仅可以指向基本类型的变量,也可以指向数组中的元素,在讲述相关内容之前,先回顾一下有关数组的定义及其概念。,1数组与指针的关系,数组实质

11、上是一组变量的有序集合,具有以下特点。 (1)同一数组中的每个元素的数据类型相同。 (2)数组在内存中占有一段连续的存储空间。 (3)数组下标是从0开始的自然数。 (4)数组名代表数组的首地址,也就是第1个数组元素的地址。 因此,只要把数组的首地址或某一元素的地址放到指针变量中,就在数组和指针之间建立起了联系,即可实现对数组元素的访问。,2使用指针访问所指向数组中的元素,C语言规定:如果指针变量p已经指向数组中的1个元素,则可以通过改变指针的指向来实现对数组中其他元素的访问。,(1)指针的加减运算,如果用户想要控制指针变量指向数组中的其他元素,可以使用指针变量的加减运算,它有如下两种基本形式(

12、其中p代表指针变量,i是1个自然数)。, p+i(p-i):获得指针当前指向位置之后(前)i个元素的地址,以实现对该元素的访问,注意此时指针的指向并未改变。 p+(p-):将指针从当前指向位置后移(前移)1个元素的位置,注意此时指针的指向已经发生改变。,习题,一、选择题 1执行以下程序段后,m的值为_。 int a23=1,2,3,4,5,6; int m,*p; p= A15 B14 C13 D12,习题,2以下程序的输出结果为_。 void fun(int x,int y,int *cp,int *dp) *cp=x+y; *dp=x-y; void main() int a,b,c,d;

13、 a=30;b=50; fun(a,b, A50,30 B30,50 C80,-20 D80,20,3函数调用时,若用数组名作实参,则传递给形参的是_。 A数组元素的个数 B数组的起始地址 C数组第一个元素的值 D数组全部元素的值 4若a是一维数组名,p是指针变量,是下列语句中非法的是_。 Ap=a; Bp+ Ca+ Dp=,6设p1和p2是指向同一个int型一维数组的指针变量,k为int型变量,则不能正确执行的语句是_。 Ak=*p1+*p2; Bp2=k; Cp1=p2; Dk=*p1*(*p2); 7设有如下定义 int arr=6,7,8,9,10; int *ptr=arr; pri

14、ntf(“%d,%d“,*ptr,*(ptr+2); 则下列程序段的输出结果为_。 A8,10 B6,8 C7,9 D6,10,8有以下程序段: char arr=“ABCDE“; char *ptr; for(ptr=arr;ptrarr+5;ptr+) printf(“%sn“,ptr); 输出结果是_。 A. ABCDE B. A C. E D. ABCDE B D BCDE C C CDE D B DE E A E,9有以下程序: void main() char a=“programming“,b=“language“; char *p1,*p2; int i; p1=a; p2=b

15、; for(i=0;i7;i+) if(*(p1+i)=*(p2+i) printf(“%c“,*(p1+i); 输出结果是_。 Agm Brg Cor Dga,10以下程序执行后,输出结果是_。 void main() int a,k=4,m=6,*p1=,12以下程序输出的结果是_。 #include void main() int a3=0,15,20; int p1=a,p2= A5 B10 C15 D运行出错,13以下程序输出的结果是_。 #include f(int *x) static int y=0; *x%2? *x+:y+; void main() int x,s=0; for(x=0;x5;x+) f( A8 B9 C10 D11,二、编程题 1输入3个整数,按由小到大的顺序输出。 2将1个字符数组中的字符倒序输出。 3有1个字符串,包含n个字符,写一函数,将此字符串中第m个字符开始的全部字符复制到1个字符串中。 4输入10个整数,将其中最小的数与第1个数对换,把最大的数

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

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

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