《C语言程序设计》-胡宏智-电子教案(含例题) 第06章

上传人:E**** 文档编号:89400247 上传时间:2019-05-24 格式:PPT 页数:141 大小:541KB
返回 下载 相关 举报
《C语言程序设计》-胡宏智-电子教案(含例题) 第06章_第1页
第1页 / 共141页
《C语言程序设计》-胡宏智-电子教案(含例题) 第06章_第2页
第2页 / 共141页
《C语言程序设计》-胡宏智-电子教案(含例题) 第06章_第3页
第3页 / 共141页
《C语言程序设计》-胡宏智-电子教案(含例题) 第06章_第4页
第4页 / 共141页
《C语言程序设计》-胡宏智-电子教案(含例题) 第06章_第5页
第5页 / 共141页
点击查看更多>>
资源描述

《《C语言程序设计》-胡宏智-电子教案(含例题) 第06章》由会员分享,可在线阅读,更多相关《《C语言程序设计》-胡宏智-电子教案(含例题) 第06章(141页珍藏版)》请在金锄头文库上搜索。

1、第6章 指 针,6.1 指针的概念 6.2指针的运算 6.3指针与数组之间的关系 6.4指针作为函数的参数及其应用程序范例 6.5指针作为函数的返回值及其应用程序范例 6.6指向函数的指针及其应用程序范例 6.7带参数的main函数及其应用程序范例 6.8指向指针的指针及其应用程序范例 6.10图形处理函数的简单应用 6.11本章小结,内容简介,61 指针的概念,6.1.1什么是指针,在程序运行过程中,所有的程序和数据都是以二进制方式存放在存储器中的。 通常8个二进制位称一个字节,我们一般把存储器中的一个字节称为一个内存单元。变量是程序中数据所占若干个存储单元的符号表示。程序在编译时,系统会根

2、据变量的数据类型为其分配相应的若干个内存单元,用于存放变量的具体数据。为了正确地访问这些内存单元, 必须为每个内存单元编上号。 根据一个内存单元的编号即可准确地找到该内存单元。内存单元的编号也叫做地址。对于一个内存单元来说,单元的地址即为指针。通常用一个变量来存放指针,这种变量称为指针变量。因此,一个指针变量的值就是某个内存单元的地址,也可称为某内存单元的指针。,61 指针的概念,在语言中,设有字符变量ch,其内容为“A”(ASCII码为十进制数 65),假设字符变量ch在存储器中的存储单元是10010001(地址用二进数表示)。有指针变量pointer,内容为10010001,就是字符变量c

3、h的存储器地址, 这种情况我们称为pointer指向变量ch,或说pointer是指向变量ch的指针。,pointer ch,为了表示指针变量和它所指向的变量之间的关系,在程序中用“*”符号表示“指向”,*pointer就是表示指针指向的存储单元,因此,我们可以用指针变量pointer和字符变量ch分别访问这个存储单元。,6.1.1什么是指针,61 指针的概念,6.1.2为什么要引入指针概念,通过变量地址可以找到该变量所占的存储单元,因此可以说变量地址“指向”变量的存储单元。直接按照变量名称访问变量的方式称为“直接访问”。把变量地址存放在一个特殊变量中,然后通过访问特殊变量的值(地址),再由此

4、地址找到最终要访问的变量的方法,称为“间接访问” 。如上图所示的那样,通过名称ch存取内存中的数据,是直接访问,用指针pointer来存取内存中的数据,是间接访问。,61 指针的概念,C语言的特色之一,也是其精华所在就是指针。使用指针可以实现以下用其它方法不易实现的操作:如对内存中的数据进行处理,而不管这些数据的类型;在函数之间快速地传递数据;直接处理内存地址。这种方法增强了C语言的处理能力、提高了程序的执行效率,尤其适合系统软件的开发,也极大地增强了程序的灵活性。另外一方面,在语言中, 一种数据类型或数据结构往往都占有一组连续的内存单元。 用“地址”这个概念并不能很好地描述一种数据类型或数据

5、结构, 而“指针”虽然实际上也是一个地址, 它是可以“指向”一个数据结构的,因而概念更为清楚,表示更为明确。但是指针不仅不易理解,而且使用不当会带来严重的错误。所以学好指针,关键是理解其概念与操作原理。,6.1.2为什么要引入指针概念,61 指针的概念,6.1.3指针变量的定义,定义指针变量的一般形式为: 存储类型 类型标识符 *变量名; 其中对指针变量的类型说明包括三个内容: (1)“*”后面的变量为一个指针变量; (2) 变量名即为定义的指针变量名; (3) 类型标识符表示该指针变量所指向的变量的数据类型。 例如: int *p1; /*p1是指向整型变量的指针变量*/ staic int

6、 *p2; /*p2是指向静态整型变量的指针变量*/ float *p3; /*p3是指向浮点变量的指针变量*/,61 指针的概念,下面对指针变量作几点说明: (1)指针变量名前的“*”表示该变量为指针变量,而指针变量名不包含该“*”。 (2)一个指针变量只能指向同一类型的变量。 例如: int *p1;表示p1是一个指针变量,它的值是某个整型变量的地址。 或者说p1指向一个整型变量。不能时而指向一个整型变量, 时而又指向一个字符变量。至于p1究竟指向哪一个整型变量, 应由向p1赋值的地址来决定。 (3)指针变量中只能存放地址,而不能将数值型数据赋给指针变量。 (4)只有当指针变量中具有确定地

7、址后才能被引用。 (5)与一般的变量一样,也可以对指针变量进行初始化。后面进一步说明。,6.1.3指针变量的定义,61 指针的概念,指针与指针变量关系: 指针: 一个变量的地址,是常量。 指针变量:专门存放变量地址的变量。 存储器的地址是常量,“指针变量”是指取值为地址的变量。定义指针变量的目的是为了通过指针(地址)去访问内存单元。,6.1.3指针变量的定义,61 指针的概念,任何一个指针变量都是用于存放它所指向变量的地址,只要能存放地址就可以了,为何还要区别不同的基类型呢? 其原理是:不同的数据类型变量,C语言系统为它们开辟的存储空间的字节数是不同的,int类型的数据存储空间是2个字节,fl

8、oat类型的数据存储空间是4个字节等等。系统表示每一个存储空间的地址时,是取该存储空间的第1个字节的地址作为该变量存储空间的地址。那么当一个基类型为int类型的指针变量p指向了一个int类型的变量a时,是将该变量a所占的2个字节的存储空间中的第1个字节存储空间的“地址”存入指针变量p中,如下图所示。,6.1.3指针变量的定义,61 指针的概念,所以根据指针变量p中存放的“地址”,只能寻找到变量a第1个字节的存储空间,如果只提取变量a所占存储空间第1个字节的数据,显而易见不是int类型变量a的原值,因为变量a的原值是通过2个字节来存储的数据。,6.1.3指针变量的定义,此时我们可以通过指针变量p

9、的类型解决问题,知道了变量a的第1个字节的地址,再根据指针变量p的类型为int类型,系统就将从变量a的第1个字节所在的地址开始,连续提取2个字节中的数据,此时的数据就是int类型变量a的原值。,61 指针的概念,6.1.4指针变量的使用,指针变量同普通变量一样,使用之前不仅要定义说明,而且必须赋予具体的值。未经赋值的指针变量不能使用,否则将造成系统混乱,甚至死机。指针变量的赋值只能赋予地址, 决不能赋予任何其它数据,否则将引起错误。在语言中,变量的地址是由编译系统分配的,对用户完全透明,用户可以不知道变量的具体地址。也不需要考虑变量的具体地址值是什么。,61 指针的概念,6.1.4指针变量的使

10、用,两个与指针有关的运算符: 1)&: 取地址运算符。 2)*:指针运算符(或称“间接访问” 运算符)。 语言中提供了地址运算符“&”来表示变量的地址。 其一般形式为: &变量名; 如&a表示变量a的地址,&b表示变量b的地址。变量本身必须预先定义,61 指针的概念,【例6-1】 输出变量的值和它的地址值 #include “stdio.h“ main() int i=125; printf(“%dn“,i); printf(“%ldn“,&i); ,EX6_1.c演示,6.1.4指针变量的使用,61 指针的概念,【例6-2】 分别用整型变量和指针变量输出变量的值 #include “stdi

11、o.h“ main() int a=10,b=20,*pa,*pb; pa=&a; pb=&b; printf(“%d,%dn“,a,b); printf(“%d,%d“,*pa,*pb); ,EX6_2.c演示,6.1.4指针变量的使用,61 指针的概念,说明: pa,pb为整型指针变量,在定义时并未指向任何整型变量,然后给指针变量pa赋以变量a的地址值,pa指向变量a,给指针变量pb赋以变量b的地址值,pb指向变量b。分别通过变量和指向变量的指针输出变量的值。 在printf(“%d,%d“,*pa,*pb);中我们使用了*pa,*pb,那么*pa和*pb是什么意思呢?*pa表示指针变量p

12、a所指的地址的内容,即变量a的内容。*pb表示指针变量pb所指的地址的内容,即变量b的内容,6.1.4指针变量的使用,61 指针的概念,指针变量的初始化方法: (1)在定义的同时进行初始化。 例如: int a=10; int *p=&a; (2)赋值语句进行初始化。 例如: int a=10; int *p; p=&a;,6.1.4指针变量的使用,61 指针的概念,指针变量的初始化方法: (3)可以用初始化了的指针变量给另一个指针变量做初始化值。例如: int x=5 ; int *p=&x ; /*将变量x的地址赋给指针变量p*/ int *qp ; /*将p的值赋给q,使p、q指向同一变

13、量x*/ (4)以将一个指针变量初始化为一个空指针。 例如:int *p=NULL; 空指针: 空指针是一个特殊的指针,它的值是0,C语言中用符号常量NULL(在stdio.h中定义)表示这个空值,并保证这个值不会是任何变量的地址。空指针对任何指针类型赋值都是合法的。一个指针变量具有空指针值表示当前它没有指向任何有意义的东西。,6.1.4指针变量的使用,61 指针的概念,注意: 1.不允许把一个数赋予指针变量,故下面的赋值是错误的: int *pa; pa=5000; 2. 被赋值的指针变量前不能再加“*”说明符,如写为下面也是错误的: int a=10; int *pa; *pa=&a; (

14、错误) pa :是指针变量,可以存储地址值。 而*pa表示指针变量所指向的存储单元。,6.1.4指针变量的使用,61 指针的概念,【例6-3】通过指针变量进行变量赋值 #include “stdio.h“ main() int i=10,x; int *p; p=&i; x=*p; printf(“i=%d,x=%dn“,i,x); ,EX6_3.c演示,6.1.4指针变量的使用,61 指针的概念,【例6-4】指针变量之间互相赋值 #include “stdio.h“ main() int a=10,*p1,*p2; p1=&a; p2=p1; a+; printf(“%d, %d, %dn“

15、,a,*p1,*p2); ,EX6_4.c演示,6.1.4指针变量的使用,61 指针的概念,【例6-5】 通过指针变量改变整型变量的值 #include “stdio.h“ main() int a, b, c, *p1, *p2; a=2; b=4; c=6; p1=&a; p2=&b; printf(“a=%d,b=%d,c=%d,*p1=%d,*p2=%d n“,a,b,c,*p1,*p2); (*p1)+; (*p2)+; printf(“a=%d,b=%d,c=%d,*p1=%d,*p2=%d n“,a,b,c,*p1,*p2);,6.1.4指针变量的使用,61 指针的概念,p2=p

16、1; p1=&c; printf(“a=%d,b=%d,c=%d,*p1=%d,*p2=%d n“,a,b,c,*p1,*p2); (*p1)+; (*p2)+; printf(“a=%d,b=%d,c=%d,*p1=%d,*p2=%d n“,a,b,c,*p1,*p2); ,EX6_5.c演示,6.1.4指针变量的使用,62指针的运算,指针变量可以进行某些运算,但其运算的种类是有限的。 它只能进行赋值运算和部分算术运算及关系运算。 指针变量的赋值运算有以下几种形式: (1)指针变量初始化赋值,前面已作介绍。 (2)把一个变量的地址赋予指向相同数据类型的指针变量。例如:int a,*pa; pa=&a; 把整型变量a的地址赋予整型指针变量pa。 (3)把一个指针变量的值赋予指向相同类型变量的另一个指针变量。如: int a,*pa=&a,*pb; pb=pa;/*把a的地址赋予指针变量pb。*/ 由于pa,pb均为指向整型变量的指针变

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

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

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