南邮c语言程序设计课件第5章090909

上传人:wt****50 文档编号:50781302 上传时间:2018-08-11 格式:PPT 页数:38 大小:925KB
返回 下载 相关 举报
南邮c语言程序设计课件第5章090909_第1页
第1页 / 共38页
南邮c语言程序设计课件第5章090909_第2页
第2页 / 共38页
南邮c语言程序设计课件第5章090909_第3页
第3页 / 共38页
南邮c语言程序设计课件第5章090909_第4页
第4页 / 共38页
南邮c语言程序设计课件第5章090909_第5页
第5页 / 共38页
点击查看更多>>
资源描述

《南邮c语言程序设计课件第5章090909》由会员分享,可在线阅读,更多相关《南邮c语言程序设计课件第5章090909(38页珍藏版)》请在金锄头文库上搜索。

1、C语言程序设计 *1*2第五章 一级指针与一维数组主讲: 计算机学院 朱立华内容提要n直接引用与间接引用的不同方式及实质 n指针是地址的类型,是对地址进行的一种类型抽象,用 来实现间接访问,掌握以下指针的知识 指针类型与指针的基类型 指针的基本操作:间接引用、加减整数、逻辑及关系运算 指针与一维数组的关系,如何用指针操作一维数组 n一维数组专用于一批类型相同的变量的处理 一维数组的定义及初始化,一维数组的基类型(数组的元素 类型)与指针基类型的一致性,一维数组名就是指针常量 访问一维数组元素的方式间接引用方式,可随机访问 一维数组元素在内存中的存储方式,可随机访问元素的实质 一维数组中的常见操

2、作及算法:输入、输出、逆置、查找、 插入、删除、排序DateDate3 3间接引用的必要性n内容回顾:int m; 表示定义一个变量,m是变量名, 即变量空间名,直接用m访问的是变量空间中的内容, 称为直接引用 n一个算法问题:输入10000个整数并求平均值,并且保 留这些原始数据到最后统一输出 n解决方案:将这10000个整数看作逻辑上前后相邻的并 且可以存储在内存中一片连续的区域,只要知道这些 数在内存中的起始地址,就能找到对应的空间,进而 访问空间中的内容,这就是间接引用方式,因此: 要有变量可以存放地址-指针; 要有类型可以定义一个标识符代表一组连续空间的起始地址 -一维数组用第4章的

3、循环可以求解 ,定义1个变量,在循环 体中读入值并求和用1个变量不能达到这一要求 ,根据前面的知识,似乎应该 定义10000个变量,可是这样 又无法用循环控制 间接引用方式下,传递某 一个数据地址(一般是第 1个数据的地址)相当于 传递了全部数据 DateDate4 4一级指针类型(引言) nC语言优越于其他高级语言的一个特性就是:可对硬件编程; 通过第一章机器语言程序设计的学习,在计算机内部访问操作 数首先是读取其在内存中的存储地址值,然后通过该地址值去 访问该地址所在空间中的内容nC语言为了实现对硬件编程,必定要将内存地址抽象为一种类 型,这就是(一级)指针类型,即指针类型是地址的类型,该

4、 类型的常量和变量值都是内存地址值。地址值是无符号整数, 无论该地址的内存中数据是什么类型,地址值都占4个字节n显然,知道地址值是为了操作这个地址中所存储的内容。通过 地址来访问数据空间的方式称为间接引用n通过该地址去间接引用的数据类型称为地址的基类型n前面学习的通过存储空间的名称引用数据的方式称为直接引用这两种类型 有区别也有联系DateDate5 5一级指针类型(概述)n直接引用与间接引用: 在C语言源程序中的直接引用方式经编译后在计算机内部实质上是 间接引用,例如源程序中有下列代码: int n,m;/定义2个整型变量,n和m是变量名 double x;/定义1个双浮点型变量,x是变量名

5、表 n=5;/直接引用,给n赋值5 m=n;/直接引用,将n中的值赋给m x=3.1415;/直接引用,给x赋值3.1415 经编译后,变量名消失,留下其地址及类型信息,如下表:变量名变量值地址类型 x3.14150x12ff70double m50x12ff78int n50x12ff7cint源程序中目标程序中地址的基类型 到哪里访问数据指示编译器怎样操作特定 地址上的内存区域:该区 域包含多少连续的字节, 数据存储的格式,以及可 以实施哪些基本操作 DateDate6 6一级指针类型(概述)nC语言中,用一级指针类型作为地址的类型。 n地址关联着两个存储空间,存放着两种不同的值,彼此又有

6、紧密 的联系,以上页表中地址0x12ff78为例如下: (int*) 0x12ff78m 0x12ff78 5整型变量m的空间, 此为变量空间编译后指向m的地址 值,是指针常量值因此,一级指针类型是复合类型,由指针的基类型名称加 ”*” 共同组成,例: int * -整型指针类型,即指针所指向的空间存int值 double * -双浮点型指针类型指针字面值常量,即指 针常量空间的名称DateDate7 7一级指针类型(用*间接引用)n利用指针去访问它指向的基类型的空间分两步: n(1)通过指针字面值常量取出基类型空间的地址,这是直接引用 (2)加间接引用运算符“*”,得到与基类型空间名称等价的

7、表达式 ,称为间接引用表达式,这是间接引用(int*) 0x12ff78m 0x12ff78 5因此,*(int*)0x12ff78与m完全等价, m=5;也可以写成: *(int*)0x12ff78=5; 上机在VC+下演示程序5.1 总结:间接引用运算符*使得指针可以访问其基类型空 间动 态演示过 程DateDate8 8一级指针类型(基本操作)n指针的基本操作加减一个整数 n(1) 指针加一个整数i,是将当前地址值加上i*sizeof(基类型) n(2) 指针减一个整数i,是将当前地址值减去i*sizeof(基类型)总结:理论上,指针可以加减任何整数,但必须保证结 果指针指向应用程序的数

8、据空间,否则不能间接访问指针字面值常量地址值基类型 值 (int*)0x12ff000x12ff00 5 (int*)0x12ff040x12ff04 6 (int*)0x12ff080x12ff08 7 (int*)0x12ff0c0x12ff0c 8 (int*)0x12ff100x12ff10 9(int*)0x12ff00+2=(int*)0x12ff08 (int*)0x12ff10-3=(int*)0x12ff04 sizeof(int)=4(int*)0x12ff10+2=(int*)0x12ff18 , 地址0x12ff18所指向的空间不 是本程序的数据空间,无意义!动 态演示

9、过 程DateDate9 9一级指针类型(基本操作)n指针的其它基本操作: n(1) 指针可以进行逻辑运算,例:!(int*)0x12ff00的结果为0 n(2) 指针可以进行关系运算,例: (int*)0x12ff00 int main() int a10,i,n; int max,min; int positive=0,negative=0; doprintf(“Please input n(110);printf(“Please input %d elements:n“,n);for (i=0;i0) positive+; else if (aimax) max=*(a+i); else

10、 if (*(a+i)m是一个整型变量的变量名,代表整型变量 空间,m的类型标识为int n同理:int a5; -a是一个数组变量的变量名,代表整个数 组空间,a的类型标识为int5 n因此,数组名a有双重含义: n(1)是一个数组变量的变量名,代表整个数组空间,在n同理:基类型为整型的指针类型 int * - 指针变量 int * x; n一维数组名是指针常量,当然可以将值赋给基类型相同的指针变量,使指针变量和数组指针在间接引用方式下“共享”同一段数组空间,这相当于把数组空间的数据传给了指针变量,称为地址传递,例:int a5;int *p=a; 一级指针变量与一维数组a0 a1 a2 a

11、3 a413ff58app0 p1 p2 p3 p413ff58DateDate2121n当p=a后,有下列等价关系存在: n(1)数组元素的表示: n 下标法:pi 等价于ai n 间接引用法:*(p+i) 等价于*(a+i) n(2)数组元素地址的表示: n 指针表达式法:p+i等价于a+i n 元素取地址法: int* p; int * p; n情况2:一条定义语句既定义基类型的变量,又定义指 针变量,此时,*近指针变量 n例:int a,*p,b; n情况3:一条定义语句定义多个同类型的指针变量时, 每个指针变量前都跟一个*号 n例:int *p,*q; n简单总结: (1)“*”贴近

12、指针变量总是正确的 n(2)每个指针变量前面都必须有一个“*” 一级指针变量与一维数组近变量名近基类型名居中必须近变量名DateDate2323n关于数组指针的基类型与指针变量基类型的一致性问题 n目的1:如果传递数组指针的目的是传递数组的值,那 么应该将数组指针传递给同类型的指针变量,类型不同 时虽然可通过强制类型转换赋值,但无意义 n例:int a5=10,15,20,25,30; n double* pd; pd=(double*)a; n float* pf; pf=(float*)a; n目的2:如果传递数组指针的目的在于高效使用内存资 源,那么可以通过强制类型转换把该数组空间指针传

13、递 给其他类型的指针变量,把用过的数组空间用来存储其 他类型的数据。 n程序5.6 同一段空间,可用作不同类型的数组空间示例 一级指针变量与一维数组强制类型转换使赋值有效 但无意义,因为pd+ia+i 且pdi ai 强制类型转换使赋值有效 但无意义,因为虽然 pf+i=a+i但pfi ai 动 态演示过 程这样做虽然节省了空间,但是 容易引起数据访问的歧义实际 编程中这种方法不常用 DateDate2424一级指针变量与一维数组n一个基类型的变量等价于长度为1的数组定义int a4;int n=5; 分析的对象a给p 的赋值p=a;p=用p间接访问元 素p0=*(p+0)= *pp0=*(p

14、+0)=*p,直接用 *p 结论:int n,*p;则n相当于长度为1的数组 *p=n;但n则有5组等价关系: (1)p= = (2) *p=m ; n(3) (4) * 却是错误的,因为m不代表地址,所以*m无意义。 n回顾表5.1的内容: nx=*(double*)0x12ff70 n 两边同时进行取址运算“*p=100; n(2)指针操作超越了变量的作用范围 例:int a3, *p=a; p=p+3; *p=100; n(3)一个字面值指针常量,例如(int*)0x12ff7c,如果其值 0x12ff7c不是系统已经分配给用户程序使用的空间地址。因此一般 编程时很少直接使用字面值指针常

15、量进行间接引用 n(4)利用指针申请的动态空间被释放后,仍用该指针进行间接访问 (具体见第6章6.5.3)一个没有赋值 的“野”指针用“野”指针 间接引用很危 险指针获得数组 首元素地址指针增加3,出 了数组范围间接引用的空间不是 程序的有效数据空间DateDate2727一级指针变量与一维数组nvoid型指针:称为通用指针或泛指针。可以把任何类型变量的地 址赋给它,但是不能利用这样的指针做相应类型的访问或处理。n例:void *p;int x=5;np= /合法n*p=6; /非法nprintf(“%d“,*p); /非法nvoid指针主要用于单纯的内存数据的拷贝。在第11章的“流与文 件”中,将遇到这样的指针。DateDate2828一级指针变量与一维数组n回顾:当一级指针变量的基类型与一维数组的基类型一致时,可 以将一维数组名赋值给指针变量,这时对数组元素的访问既可以用 一维数组也可以用指针变量。 n用一维数组访问数组的元素只能通过改变下标的方式 n用一级指针变量间接访问一维数组的元素可以通过移动下标(指 针不动)或移动指针(指针改变)两种方式 n程序5.7 分别用移动下标的方法和移动指针的方法实现输出数组 的所有元素。 在方法1中,pai+实际上先访问pai,再执

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

最新文档


当前位置:首页 > 生活休闲 > 社会民生

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