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

上传人:我*** 文档编号:145474385 上传时间:2020-09-21 格式:PPT 页数:38 大小:928KB
返回 下载 相关 举报
南邮C语言程序设计课件第5章_第1页
第1页 / 共38页
南邮C语言程序设计课件第5章_第2页
第2页 / 共38页
南邮C语言程序设计课件第5章_第3页
第3页 / 共38页
南邮C语言程序设计课件第5章_第4页
第4页 / 共38页
南邮C语言程序设计课件第5章_第5页
第5页 / 共38页
点击查看更多>>
资源描述

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

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

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

3、-一维数组,间接引用方式下,传递某一个数据地址(一般是第1个数据的地址)相当于传递了全部数据,2020/9/20,5,一级指针类型(引言),C语言优越于其他高级语言的一个特性就是:可对硬件编程;通过第一章机器语言程序设计的学习,在计算机内部访问操作数首先是读取其在内存中的存储地址值,然后通过该地址值去访问该地址所在空间中的内容 C语言为了实现对硬件编程,必定要将内存地址抽象为一种类型,这就是(一级)指针类型,即指针类型是地址的类型,该类型的常量和变量值都是内存地址值。地址值是无符号整数,无论该地址的内存中数据是什么类型,地址值都占4个字节 显然,知道地址值是为了操作这个地址中所存储的内容。通过

4、地址来访问数据空间的方式称为间接引用 通过该地址去间接引用的数据类型称为地址的基类型 前面学习的通过存储空间的名称引用数据的方式称为直接引用,2020/9/20,6,一级指针类型(概述),直接引用与间接引用: 在C语言源程序中的直接引用方式经编译后在计算机内部实质上是间接引用,例如源程序中有下列代码: int n,m;/定义2个整型变量,n和m是变量名 double x;/定义1个双浮点型变量,x是变量名表 n=5;/直接引用,给n赋值5 m=n;/直接引用,将n中的值赋给m x=3.1415;/直接引用,给x赋值3.1415 经编译后,变量名消失,留下其地址及类型信息,如下表:,源程序中,目

5、标程序中,地址的基类型,到哪里访问数据,指示编译器怎样操作特定地址上的内存区域:该区域包含多少连续的字节,数据存储的格式,以及可以实施哪些基本操作,2020/9/20,7,一级指针类型(概述),C语言中,用一级指针类型作为地址的类型。 地址关联着两个存储空间,存放着两种不同的值,彼此又有紧密的联系,以上页表中地址0 x12ff78为例如下:,整型变量m的空间,此为变量空间,编译后指向m的地址值,是指针常量值,因此,一级指针类型是复合类型,由指针的基类型名称加”*” 共同组成,例: int * -整型指针类型,即指针所指向的空间存int值 double * -双浮点型指针类型,指针字面值常量,即

6、指针常量空间的名称,2020/9/20,8,一级指针类型(用*间接引用),利用指针去访问它指向的基类型的空间分两步: (1)通过指针字面值常量取出基类型空间的地址,这是直接引用 (2)加间接引用运算符“*”,得到与基类型空间名称等价的表达式,称为间接引用表达式,这是间接引用,因此,*(int*)0 x12ff78与m完全等价, m=5;也可以写成: *(int*)0 x12ff78=5; 上机在VC+下演示程序5.1,总结:间接引用运算符*使得指针可以访问其基类型空间,2020/9/20,9,一级指针类型(基本操作),指针的基本操作加减一个整数 (1) 指针加一个整数i,是将当前地址值加上i*

7、sizeof(基类型) (2) 指针减一个整数i,是将当前地址值减去i*sizeof(基类型),总结:理论上,指针可以加减任何整数,但必须保证结果指针指向应用程序的数据空间,否则不能间接访问,sizeof(int)=4,(int*)0 x12ff10+2=(int*)0 x12ff18, 地址0 x12ff18所指向的空间不是本程序的数据空间,无意义!,2020/9/20,10,一级指针类型(基本操作),指针的其它基本操作: (1) 指针可以进行逻辑运算,例:!(int*)0 x12ff00的结果为0 (2) 指针可以进行关系运算,例:(int*)0 x12ff00(int*)0 x12ff0

8、8 的结果为1(真) (3)两个类型相同的指针(即基类型相同的指针)可以相减,地址大的减地址小的,结果为两个地址间区域所含基类型数据个数。,2020/9/20,11,将物理上前后相邻、类型相同的一组变量作为一个整体引入C语言,这个整体称为(一维)数组类型的变量,简称(一维)数组,其中每一个变量称为数组元素,变量的个数称为数组长度或数组容量。 引入数组的目的:利用间接引用方式,访问一组数据。具体地说,从第一个数组元素的地址,计算出其他所有数组元素的地址,然后通过数组元素的地址,间接访问数组元素。 定义一个数组:需要: (1)指定数组名,这个名称代表着第一个数组元素的指针,是一个指针常量,等价于一

9、个指针字面值常量,称为数组指针 (2)指定数组元素的类型,它是数组指针的基类型,是间接引用方式的基础 (3)指定数组长度,即数组包含的元素个数,它决定了数组指针在进行加减整数的算术运算时的有效范围,一维数组类型(概述),2020/9/20,12,一维数组类型(数组定义),数组的定义格式为: 类型标识符 一维数组名整型常量表达式; 例:int a5;,类型标识符是数组元素的类型(也称为数组的基类型)的标识,是1个合法的用户自定义标识符,代表整个数组空间的起始地址(第1个元素的地址),是1个指针常量,表示数组的长度,即数组元素的个数,必须用一个常量表达式而不能用变量,间接引用表达式,下标(索引)表

10、达式,注意:数组元素的下标从0开始,可以是整型常量或变量,需要保证范围在0整型常量表达式-1,否则越界,2020/9/20,13,一维数组类型(数组定义),2020/9/20,14,一维数组的初始化:在定义数组时为其全部或部分元素指定初值。 一维数组的初始化的形式: 类型标识符 一维数组名整型常量表达式=常量1 ,常量2,常量n; 正确的初始化示例: int a5=1,2,3,4,5; int a =1,2,3,4,5; int a5=1,2*4; 错误的初始化示例: int a5=,2,3 ; int a5=1,2,3,4,5,6,7;,一维数组类型(初始化),所有元素都有初值,a0至a4的

11、值依次为1,2,3,4,5,相当于a5=1,2,3,4,5;当所有元素都有初值时,数组元素个数可缺省,自动等于初值个数,相当于a5=1,8,0,0,0;可以只对数组的前几个元素赋初值,其余元素的初值自动为0。注意!当不做初始化时所有数组元素的值均为随机数而不是0,对数组元素初始化时只能从左到右依次,只能缺省最右边的元素值,初值个数不能超过数组元素的个数,2020/9/20,15,一维数组定义(包括初始化)结束之后,只能对其元素进行访问,而不能对数组整体访问 错误的数组赋值示例: (1) int a5; a5=1,2,3,4,5; (2) int a5; a=1,2,3,4,5; (3) int

12、 a5=1,2,3,4,5; int b5=a; b=a; 正确做法可以是: b0=a0; b1=a1;b2=a2;b3=a3;b4=a4; 最简洁通用的方法是:(设已有变量定义:int i;) for (i=0;i5;i+) bi=ai;,一维数组类型(赋值),错误原因:a5是对某个数组元素的引用,而长度为5的数组没有a5这个元素,不能用一组值给一个元素赋值,错误原因:数组名a在赋值语句中是指向第1个数组元素的指针常量 int max,min; int positive=0,negative=0; do printf(Please input n(110); printf(Please in

13、put %d elements:n,n); for (i=0;in;i+) scanf(%d,2020/9/20,18,程序5.3:源程序代码,for (i=0;i0) positive+; else if (aimax) max=*(a+i); else if (*(a+i)min) min=*(a+i); printf(positive=%dn,positive); printf(negative=%dn,negative); printf(max element=%dn,max); printf(min element=%dn,min); return 0; ,?思考:为什么这里的if不

14、能省略?,?思考:为什么这里的if不能省略?,2020/9/20,19,回顾:int m; -m是一个整型变量的变量名,代表整型变量空间,m的类型标识为int 同理:int a5; -a是一个数组变量的变量名,代表整个数组空间,a的类型标识为int5 因此,数组名a有双重含义: (1)是一个数组变量的变量名,代表整个数组空间,在 同理:基类型为整型的指针类型 int * - 指针变量 int * x; 一维数组名是指针常量,当然可以将值 赋给基类型相同的指针变量,使指针变量 和数组指针在间接引用方式下“共享” 同一段数组空间,这相当于把数组空间的 数据传给了指针变量,称为地址传递, 例:int

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

16、总是正确的 (2)每个指针变量前面都必须有一个“*”,一级指针变量与一维数组,近变量名,近基类型名,居中,必须近变量名,2020/9/20,24,关于数组指针的基类型与指针变量基类型的一致性问题 目的1:如果传递数组指针的目的是传递数组的值,那么应该将数组指针传递给同类型的指针变量,类型不同时虽然可通过强制类型转换赋值,但无意义 例:int a5=10,15,20,25,30; double* pd; pd=(double*)a; float* pf; pf=(float*)a; 目的2:如果传递数组指针的目的在于高效使用内存资源,那么可以通过强制类型转换把该数组空间指针传递给其他类型的指针变量,把用过的数组空间用来存储其他类型的数据。 程序5.6 同一段空间,可用作不同类型的数组空间示例,一级指针变量与一维数组,强制类型转换使赋值有效但无意义,因为pd+ia+i且pdi ai,强

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

当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

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