C语言程序设计 教学课件 PPT 作者 朱立华 王立柱 C语言程序设计课件第5章090909

上传人:E**** 文档编号:89370631 上传时间:2019-05-24 格式:PPT 页数:38 大小:923KB
返回 下载 相关 举报
C语言程序设计 教学课件 PPT 作者 朱立华 王立柱 C语言程序设计课件第5章090909_第1页
第1页 / 共38页
C语言程序设计 教学课件 PPT 作者 朱立华 王立柱 C语言程序设计课件第5章090909_第2页
第2页 / 共38页
C语言程序设计 教学课件 PPT 作者 朱立华 王立柱 C语言程序设计课件第5章090909_第3页
第3页 / 共38页
C语言程序设计 教学课件 PPT 作者 朱立华 王立柱 C语言程序设计课件第5章090909_第4页
第4页 / 共38页
C语言程序设计 教学课件 PPT 作者 朱立华 王立柱 C语言程序设计课件第5章090909_第5页
第5页 / 共38页
点击查看更多>>
资源描述

《C语言程序设计 教学课件 PPT 作者 朱立华 王立柱 C语言程序设计课件第5章090909》由会员分享,可在线阅读,更多相关《C语言程序设计 教学课件 PPT 作者 朱立华 王立柱 C语言程序设计课件第5章090909(38页珍藏版)》请在金锄头文库上搜索。

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

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

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

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

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

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

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

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

10、意:数组元素的下标从0开始,可以是整型常量或变量,需要保证范围在0整型常量表达式-1,否则越界,2019/5/24,13,一维数组类型(数组定义),2019/5/24,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,对数组元素初始化时只能从左到右依次,只能缺省最右边的元素值,初值个数不能超过数组元素的个数,2019/5/24,15,一维数组定义(包括初始化)结束之后,只能对其元素进行访问,而不能对数组整体访问 错误的数组赋值示例: (1) int a5; a5=1,2,3,4,5; (2) int a5; a=1,2,3,4,5; (3) int a5=

12、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个数组元素的指针常量&a0,常量不是左值,不能被赋值。,错误原因:一个数组不能给另一个数组初始化,错误原因:一个数组不能给另一个数组整体赋值,2019/5/24,16,程序5.2 编程定义并初始化一维数组

13、,显示一维整型数组所有元素的值及对应地址,并对数组的所有元素求和 思路: (1)首先需要定义并初始化数组(假设数组名为a),根据题意,还需要定义循环控制变量和累加器变量 (2)然后分别用一层循环输出所有的元素值、地址值 (3)再用一层循环求所有元素之和,最后输出和值 程序5.3从键盘上输入n(1n10)个整数,输出这些元素,再分别统计其中正数和负数的个数,并求出最大值与最小值 思路:,一维数组类型(举例),元素值有两种等价表示:ai和*(a+i),元素地址有两种等价表示:&ai和a+i,(1)首先需要定义数组以存储n个整数,再用一层循环输出元素值 (2)然后分别用一层循环作统计、找最大最小值

14、(3)最后输出结果,2019/5/24,17,程序5.3:源程序代码,#include int main() int a10,i,n; int max,min; int positive=0,negative=0; do printf(“Please input n(110); printf(“Please input %d elements:n“,n); for (i=0;in;i+) scanf(“%d“,2019/5/24,18,程序5.3:源程序代码,for (i=0;i0) positive+; else if (aimax) max=*(a+i); else if (*(a+i)m

15、in) min=*(a+i); printf(“positive=%dn“,positive); printf(“negative=%dn“,negative); printf(“max element=%dn“,max); printf(“min element=%dn“,min); return 0; ,?思考:为什么这里的if不能省略?,?思考:为什么这里的if不能省略?,2019/5/24,19,回顾:int m; -m是一个整型变量的变量名,代表整型变量空间,m的类型标识为int 同理:int a5; -a是一个数组变量的变量名,代表整个数组空间,a的类型标识为int5 因此,数组名a有双重含义: (1)是一个数组变量的变量名,代表整个数组空间,在&a,sizeof(a)中体现该含义,但是数组变量不能通过其名称直接引用数组元素,因此数组名称“退化”了 (2)是指向第一个数组元素的指针常量,所有元素的地址可根据该常量的地址值计算求得,从而方便实现间接访问数组的元素 程序5.4 设计程序验证d与&d的区别,重点关注d+1与&d+1的不同,(选讲)一维数组名的双重含义,2019/5/24,20,(选讲)一维数组名的双重含义,数组名具体代表什么意思,要依赖上下文而定,如下表:,2019/5/24,21,引入数组的目的:传递数组首元素地址,相当于传递整个数组空间所有元素的值

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

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

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