C语言程序设计 教学课件 ppt 作者 姚海军 全书 第6章

上传人:E**** 文档编号:89370581 上传时间:2019-05-24 格式:PPT 页数:59 大小:1.14MB
返回 下载 相关 举报
C语言程序设计 教学课件 ppt 作者 姚海军 全书 第6章_第1页
第1页 / 共59页
C语言程序设计 教学课件 ppt 作者 姚海军 全书 第6章_第2页
第2页 / 共59页
C语言程序设计 教学课件 ppt 作者 姚海军 全书 第6章_第3页
第3页 / 共59页
C语言程序设计 教学课件 ppt 作者 姚海军 全书 第6章_第4页
第4页 / 共59页
C语言程序设计 教学课件 ppt 作者 姚海军 全书 第6章_第5页
第5页 / 共59页
点击查看更多>>
资源描述

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

1、6.1 指针的基本概念 6.2 指针变量的运算 6.3 指针与数组 6.4 指针与字符串,6.1.1 指针 在计算机中,所有的数据都是存放在存储器中的。一般把存储器中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数不等,如整型量占2个单元,字符量占1个单元等,这在基本数据类型中已有详细的介绍。为了正确地访问这些内存单元,必须为每个内存单元编号,根据一个内存单元的编号即可准确地找到该内存单元。内存单元的编号也叫做地址,通常也把这个地址称为指针。 指针是一种用于存储“另外一个变量的地址”的变量。,6.1 指针的基本概念,说明: 指针是一个变量类型,只是它的值是某个变量的地址。 这个地址

2、不仅可以是变量的地址,也可以是其他数据结构的地址。 指针虽然实际上也是一个地址,但它却是一个数据结构(如数组)的首地址,它是指向一个数据结构的,因而概念更为清楚,表示更为明确。,6.1.2 指针的定义及初始化 和一般变量一样,对指针变量的类型说明也包括三个方面的内容:指针类型说明、指针变量名和变量值(指针)所指向的变量的数据类型。 1. 指针变量的声明 指针变量的一般形式为: 类型说明符 *变量名; 其中,* 表示这是一个指针变量,变量名即为定义的指针变量名,类型说明符表示本指针变量所指向的变量的数据类型。,2指针变量的初始化 指针变量同普通变量一样,使用之前不仅要定义说明,而且必须赋予具体的

3、值。未经赋值的指针变量不能使用,否则将造成系统混乱,甚至死机。另外,指针变量的赋值只能赋予地址,绝不能赋予任何其他数据,否则会引起错误。 语言中提供了地址运算符&来表示变量的地址。其一般形式为: & 变量名; 如“&a”表示变量a的地址,&b表示变量b的地址。特别要注意的是:变量本身必须预先说明。,设有指向整型变量的指针变量为p,如要把整型变量a 的地址赋予p可以有以下两种方式: 方式1: int a; int *p=是错误的。被赋值的指针变量前不能再加“*”说明符,如写为 *p=&a也是错误的。 如果将一个指针初始化为NULL,表示该指针并不指向任何地址。,6.1.3 指针运算符 指针有两种

4、运算符:一是取变量地址的操作运算符“&”;另一个是间接访问操作运算符“*”。 “&”运算符是一元运算符,它返回操作数的内存地址,可以赋给类型合适的指针。在介绍scanf函数及指针变量赋值时,我们已经了解并使用了“&”运算符。,“*”运算符也是一个一元运算符,与“&”运算符相反,用来表示指针变量所指的变量,用于返回指针指向的内存变量地址中存储的值。在“*”运算符之后跟的变量必须是指针变量。需要注意的是,指针运算符“*”和指针变量说明中的指针说明符“*”不是一回事。在指针变量说明中,“*”是类型说明符,表示其后的变量是指针类型。而表达式中出现的“*”则是一个运算符,用以表示指针变量所指的变量。 两

5、个运算符与其他一元运算符优先级相同,自右向左结合。,其中,指针变量pa取得了整型变量a的地址,而 *pa取得的是变量a的值。该例子说明“*”运算符不仅可以获得变量a的值,而且可以修改变量a的值。程序的运行结果如图6-1所示。,图6-1 指针运算符的使用,6.1.4 程序案例 【例6-2】 用指针实现两个数据的交换。要求从键盘上输入两个数,输出交换后的两个数。 程序清单如下:,scanf(“%d”, ,图6-2 用指针交换两个数,数据交换的程序实现总是类似的,需要一个中间变量。本例中,当给第一个数num1赋值20,给第二个数num2赋值40时,程序的运行结果如图6-2所示。 【例6-3】 用指针

6、求出三个数中最大的。要求从键盘上输入三个整数,输出此三个数中的最大数。,程序清单如下: #include void main() int num1,num2,num3,max; int *pnum1,*pnum2,*pnum3; printf(“请输入三个整数:“); scanf(“%d%d%d“,当输入的三个数分别是12、-45、23时,程序运行后输出的最大数为23。程序运行结果如图6-3所示。,图6-3 用指针求最大数,6.2 指针变量的运算,6.2.1 赋值运算 赋值运算有以下几种形式: (1) 指针变量初始化赋值。如: int a=5,*p= 是把整型变量a的地址赋予整型指针变量pa。

7、,(3) 把一个指针变量的值赋予指向相同类型变量的另一个指针变量。如: int a,*pa=,数组名表示数组的首地址,故可赋予指向数组的指针变量pa。也可写为: pa=,或用初始化赋值的方法写为: char *pc=“C Language”; 这里应说明的是,并不是把整个字符串装入指针变量,而是把存放该字符串的字符数组的首地址装入指针变量。 指针与数组和字符串的使用,后面将有详细说明。,6.2.2 算术运算 1两指针变量相减 两指针变量相减所得之差是两个指针所指数组元素之间相差的元素个数。实际上是两个指针值(地址)相减之差再除以该数组元素的数据类型长度(字节数)。例如pf1和pf2是指向同一浮

8、点数组的两个指针变量,设pf1的值为2010H,pf2的值为2000H,而浮点数组每个元素占4个字节,所以pf1-pf2的结果为(2010H-2000H)/4=4,表示pf1和pf2之间相差4个元素。 两个指针变量不能进行加法运算。两个指针变量相加毫无实际意义。,2使用 +/- 将指针递增或递减 例如: int *pnum,a 10; pnum=a; pnum+; 程序中,pnum是指向整型数组a的指针变量的首地址。使用 + 运算符递增该指针,表明pnum将指向数组a连续的下一个元素的首地址。这意味着,指针移动的大小不是到下一个地址单位,而是移动的这种类型的长度,即下一个元素的首地址。 - 运

9、算符的功能与 + 的类似。,3. 函数sizeof(dataType) 函数sizeof(dataType)的返回值就是指定数据类型的长度,因此,例子中的pnum+ 就表示将指针以sizeof(int)为单位移动。又如: pnum= 第一个语句将指针指向数组第七个元素;第二个语句将指针减去3,即向前移动3个元素,指针指向第四个元素,亦即 &a3。,6.2.3 指针变量的关系运算 两个指针变量在有意义的情况下,可以进行关系运算,如: int *pf1,*pf2; pf1=pf2; /表示比较指针pf1和pf2,看它们是否相等,即是否指向同一整型数 pf1pf2; /表示pf1处于高地址位置,而p

10、f2处于低地址位置 pf1pf2; /表示pf1处于低地址位置,而pf2处于高地址位置 指针变量还可以与0比较。设p为指针变量,则p=0表明p是空指针,它不指向任何变量;p!=0表示p不是空指针。空指针是由对指针变量赋予0值而得到的。,6.3.1 指向数组的指针 指向数组的指针变量称为数组指针变量。指向数组的指针可以指向数组的首地址,也可以指向数组中的某个元素。 我们知道,一个数组是由连续的一块内存单元组成的。数组名就是这块连续内存单元的首地址。一个数组也是由各个数组元素(下标变量)组成的。每个数组元素按其类型不同占有几个连续的内存单元。一个数组元素的首地址也是指它所占有的几个内存单元的首地址

11、。一个指针变量既可以指向一个数组,也可以指向一个数组元素,可把数组名或第一个元素的地址赋予它。如要使指针变量指向第i号元素,可以把i元素的首地址赋予它或把数组名加i赋予它。,6.3 指 针 与 数 组,int a, *pa; &a0和a均指向同一单元,它们是数组a的首地址,也是数组的第一个元素a0的首地址;pa+1、a+1、&a1均指向数组的第二个元素a1;类推可知,a+i、&ai指向数组的第i+1个元素ai。应该说明的是,pa是变量,而a、&ai都是常量。在编程时应予以注意。,下面的例子就指向数组的首地址,程序运行结果是输出第一个元素的值: int array=12,23,34,45,56,

12、67; /声明并初始化一个数组 int *parr; /声明一个指针就是变量 parr=array; /将指针指向数组的首地址 printf(“%d”,*parr); /输出第一个元素的值 输出结果是12,而不是122334455667或其他值。,6.3.2 数组指针变量说明的一般形式 数组指针变量说明的一般形式为: 类型说明符 * 指针变量名 其中,类型说明符表示所指数组的类型。一般形式中,指向数组的指针变量和指向普通变量的指针变量的说明是相同的。 引入指针变量后,可以用以下两种方法来访问数组元素: 第一种方法为下标法,即用ai形式访问数组元素。在第4章介绍数组时都是采用这种方法。 第二种方

13、法为指针法,即采用*(pa+i)形式,用间接访问的方法来访问数组元素。,6.3.3 程序案例 【例6-4】 使用指针变量为数组赋值并输出数组元素的值。 程序清单如下: #include void main() int arr5,i,*parr; /定义整型数组和指针 parr=arr; /将指针parr指向数组arr for(i=0;i5;i+) ,图6-4 用指针处理数组元素,【例6-5】 使用指针求出数组中最大元素的值。 程序清单如下: #include void main() int arr5,i,*parr,max; printf(“请输入五个整型数:n“); for(i=0;i5;i

14、+), 运行程序时,顺序输入12,89,23,45,65五个数,输出正确的结果:数组中的最大值是89,如图6-5所示。比较用指针和用数组的编程方法可看出,它们是很相似的。,图6-5 用指针求数组元素中的最大值,【例6-6】 使用指针对数组中的元素按从小到大的顺序排序。即使用指针实现冒泡排序。 程序清单如下: #include void main() int i,j,temp; /定义变量 int arr5; int *first,*last; printf(“请输入五个整型数:n“); for(i=0;i5;i+),图6-6 用指针实现冒泡排序,通过对指针变量的学习,对指向字符变量的指针变量应

15、赋予该字符变量的地址。如: char c,*p= 则表示s是一个指向字符数组(字符串)的指针变量。把字符串的首地址赋予s。,6.4 指针与字符串,6.4.1 字符指针 我们已经知道,字符串实际上就是字符数组,所以指向字符串的指针就是指向字符数组的指针,通过指向数组的指针的偏移可以遍历字符数组即字符串中的各个字符。例如: char name=“Jane“; 用5个字符的空间来保存。使用字符指针,来表述这个字符串如下: char *name= “Jane“; 系统也为 *name分配了5个字符的空间,并初始化为Jane,结尾仍是一个结束符 0。,当使用字符指针存储字符串时,用指针的算术运算对字符串

16、进行操作。 【例6-7】 使用字符指针求给出的字符串长度。 程序清单如下: #include void main() char *msg=“Everything I do,I do it for you!“; int count=0; char *prt; for(prt=msg;*prt!=0;prt+) count+;图6-7 用指针求字符串长度 printf(“n该字符串长度为:%dn“,count); ,程序定义了字符串指针变量msg,并初始化为“Everything I do,I do it for you!”;定义了计数器count,并赋初值为0;还定义了一个指向字符串的指针变量prt。程序运行结果,输出了字符串的长度,如图6-

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

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

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