第三讲 数组指针和引用.ppt_第1页
第三讲 数组指针和引用.ppt_第2页
第三讲 数组指针和引用.ppt_第3页
第三讲 数组指针和引用.ppt_第4页
第三讲 数组指针和引用.ppt_第5页
已阅读5页,还剩62页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第三讲 数组、指针和引用,主讲人:生 龙 Email: long_,内容提要,数组 数组的概念 一维数组 二维数组 字符数组,指针与引用 指针的概念 指针的使用 有关指针的小结 引用 作业,数 组,数组的概念,数组由单一类型的数据元素组成的有序数据集合,表示每个数据元素使用数组名和下标来表示 存储存放在连续的内存单元中,目的精炼程序,快速查找和存取,一维数组,定义:数据类型 数组名常量表达式;,int a10; /定义了具有10个元素的整型数组a,数组元素的访问:数组名下标表达式;,a0=a5+a7-a2*3;,初始化:数据类型 数组名常量表达式=初始值1,初 始值2,初始值n;,int a1

2、0=0,1,2,3,4,5,6,7,8,9; int a5=0,0,0,0,0; int a=1,1,1;,注:不能给数组整体赋初值。,数 组,例3.1,数 组,数 组,数 组,例3.2,前20项?,数 组,数 组,数 组,例3.3 用起泡法对10个数排序(由小到大),设计思路:依次比较相邻两数,将小的调到前头。,第一轮起泡,第二轮起泡,数 组,注:若在某轮的起泡过程中一次数据交换都未发生,表明已经排好序,可提前结束排序。,数 组,数 组,二维数组具有两个下标的数组,定义:数据类型 数组名常量表达式1 常量表达式2; (常量表达式1表示数组的行数,常量表达式2表示数组的列数),float a3

3、4; /定义了具有3*4个元素的浮点型数组a,数 组,可以把二维数组看成是特殊的一维数组,例如:可以把a34看做是三个一维数组,每个数组具有4个元素。,数 组,二维数组在内存中的存储方式与一维数组相类似,也是连续存放,顺序是:按行存放,即先存放第一行的元素,再存放第二行的元素,依此类推。,二维数组元素的访问: 数组名下标表达式1下标表达式2;,如:a01=a23+a13-a1*23-1;,二维数组初始化: 分行赋初值,如:int a34=1,2,3,4,5,6,7,8,9,10,11,12; 整体赋初值,如:int a34=1,2,3,4,5,6,7,8,9,10,11,12; 对部分元素赋初

4、值,如:int a34=1,5,9;,只对第一列的元素赋初值; int a34=1,2,3,4;,只对第一行的元素赋初值。 对全部元素赋初值时可以不指定第一维的长度(行数),如: int a34=1,2,3,4,5,6,7,8,9,10,11,12;等价于 int a4=1,2,3,4,5,6,7,8,9,10,11,12;,数 组,注:若定义数组为amn,则访问数组元素时,下标 最大为m-1和n-1。,数 组,例3.4,程序?,数 组,数 组,数 组,例3.5,思路:把矩阵中第一个元素赋给max,然后将max依次与矩阵中元素比较,始终保持max中元素是最大值。,数 组,数 组,数 组,字符数

5、组用来存放字符数据的数组,定义:char 数组名常量表达式1 常量表达式2;,注:1. 字符数组中一个元素存放一个字符; 2. C+中的字符串变量不能直接定义和使用,必须通过定义字符型数组来间接完成(或通过包含头文件来调用C+提供的字符串处理函数)。,char c10=I, ,a, m, , h,a,p,p,y;,char c=I, ,a, m, , h,a,p,p,y;,char c5; c=C,h,i,n,a; /错误,初始化后不能对整个数组一次赋值,字符数组初始化:,数 组,字符串的初始化:char 数组名常量表达式=“字符串常量”,char array1=“HELLO”; char a

6、rray1=H,E,L,L,O,/0;,注:/0是字符串结束标志,程序依靠检测0的位置判断字 符串是否结束。因此,字符数组一般不等同于字符串。,字符数组的使用 1.按单个字符输入输出(与一般数组的操作相同); 2.将字符串作为一个整体输入输出。 char array10; cinarray; char array=“HELLO”; coutarray; 注:在所有类型的数组中,只有字符串才能整体输入输出。,数 组,字符串运算函数(通过包含头文件来调用,自学),Strlen 求字符串长度; Strcat 连接两个字符串; Strcpy 字符串复制; 4.Strcmp 比较两个字符串的大小,自左至

7、右比较相应字符的ASCII码,直到不等,则停止比较; 5.Strlwr 将字符串中字符全部转换成小写; 6.Strupr 将字符串中字符全部转换成大写; 7.Strncmp 比较前n个字符; 8.Strncpy 将字符串2的前n个字符拷入字符数组1。,指针与引用,指针的概念, 内存中的一个字节为一个存储单元( Byte)。 存储单元的编号称为地址。 变量的地址是指该变量所在存储区域的第一个 字节(单元)的地址。,例:int a; float b; char c;,这三个地址就称为变量a、b、c的指针。,指针与引用,指针是一个数值,C+提供了一种类型的变量用于存放地址值,即存放指针,这种变量就是

8、指针变量。,指针变量的定义格式:类型说明符 *指针变量名;,例:int *p ; 定义 p 为指向 int 类型变量的指针变量 float *f ; 定义 f 为指向 float 类型变量的指针变量,int * 为int型指针类型标识符。 float * 为float型指针类型标识符。,指针与引用,几点说明: 一个指针变量只能指向同一数据类型的变量,该 数据类型是在定义指针变量时明确给定的。 C+语言规定有效数据的指针不指向0单元(为非0值), 如果指针变量值为0,即NULL(在ios.h中已定义), 表示空指针,即不指向任何变量。 不要把地址值与整数类型值相混淆。 例如:地址2000与整型量

9、2000是两个不同的概念。,指针与引用,指针的使用,1、 /将整型变量 m 的地址值赋给指针变量 p,指针与引用,2、* 间接存取运算 功能:访问指针指向的变量 int *p , m=200 , n ; p= 将 100 赋给指针变量 p 所指向的变量 m,200,n,指针与引用,指针变量的初始化 初始化格式:类型说明符 *指针变量名=初始地址值 ; 例:char c, *pc ; pc=/* 指针初始化,定义时进行 */,两种方式等效,指针与引用,直接访问和间接访问,在C+中定义的所有变量,编译器都会记录它们的属性, 便于以后对它们的访问, 如在前例中定义的两个变量m和p, 编译器记录的属性

10、如下表:,指针与引用,1. 直接存取方式(直接访问) 按变量地址存取变量值的方式称为直接存取方式, 在程序中体现为直接使用变量名来存取变量值,2. 间接存取方式(间接访问),如果变量 p 存放着变量 m 的地址,那么对变量 m 的访问可以首先访问变量 p,取得变量 m 的地址,然后按该地址进行对 m 的存取操作, 称为间接存取方式。 在程序中体现为通过 p 来存取变量 m 的值。,例: m=5,n=m 直接存取 m *p=5,n=*p 间接存取 m,指针与引用,总结: 若有 int m ; int *p = 注意指针变量的指向类型,只有相同类型数据变量的地址才能赋给该指针变量。即整型变量的地址

11、只能赋给整型指针。,指针与引用,关于指针使用的几点说明(续): 同类型指针变量之间可以相互赋值,不同类型的指针变量一般不能相互赋值; 允许将一个整型常数经强制类型转换后赋给指针变量,如: float *fpp ; fpp = (float *)5000 ; 其意义:将5000作为一个地址值赋给指针变量fpp 。,指针与引用, 指针使用的常见错误 1、使用未初始化的指针变量 void main( ) int x,*p ; x=0 ;*p=x ; . 2、指针变量所指向的数据类型与其定义的类型不符 void main( ) float x,y ; int *p ; p= . ,指针与引用,例3.7

12、,指针与引用,指针与引用,例3.8,指针作为函数参数的使用,输出?,指针与引用,指针与引用,输出?,指针与引用,指针与引用,撤消,局部动态变量,main( ) 工作区,swap1( ) 工作区,局部动态变量,main( ) 工作区,swap2( ) 工作区,撤消,基本类型做函数参数,指针做函数参数,指针与引用,从被调函数中返回信息的几种方法 1、利用return语句返回值 (只能返回一个值) 例:int min(int a,int b) return(ab)?a:b); ,2、利用全局变量得到函数调用结果 (安全性欠佳) 例:int max,min ; /可得到多个结果 void fun(in

13、t a,int b) max=(ab)?a:b ; min=(ab)?a:b ; void main( ) fun(5,8); coutmax,minendl; ,指针与引用,3、利用指针变量作为函数参数来取得函数调用的结果。 (较好,可安全地得到多个结果值) 涉及参数空间的分配 例:void fun(int a,int b,int *pmax,int *pmin) *pmax=(ab)?a:b ; *pmin=(aab; fun(a,b, ,指针与引用,4、利用引用作为函数参数来取得函数调用的结果 (较好,可安全地得到多个结果值) 不涉及参数空间的分配 例:void fun(int a, i

14、nt b, int ,形参变量是实参的别名, 使用起来较方便、直观。,指针与引用,指向数组的指针,例:int a10; / 假定a的存储起始位置为1040 int *p; / p是指向整型变量的指针, /a数组的元素为整型变量, /那么 p 可以指向 a 数组的任意元素。,p=a;,/ 结果 p=1040,p 指向a0,p+;,/ 结果 p=1044,p+;,/ 结果 p=1048,p- -;,/ 结果 p2=1044,向下移动一个元素的位置,若 p = 则 *p 访问a6,指针与引用,指针可进行的运算(一般为加、减、比较运算),(1)指针 数值 (2)指针-指针 (3)指针 比较 指针,(1

15、)指针数值 运算的意义 如果:p 是指针,n 是数值 则:pn 表示 p 向后/向前移动 n 个元素位置。 即:结果 p 的值n*c,若 p 是 int 型指针,则 c 等于 4 若 p 是 char 型指针,则 c 等于 1 若 p 是 float 型指针,则 c 等于 4 .,指针与引用,指向相同数据类型的指针变量可以相减,其结果 为两指针所指向地址之间数据的个数。,例:int *px ,*py ,n ,a5 ; px=,(2)指针 - 指针 运算的意义,结果:n 值为3,指针与引用,= != =,(3)指针 比较 指针,指针的关系运算是两个指针所指向的地址之间的 比较运算,产生的结果为

16、0(假)和 1(真)。,例:有定义:double a5,*p1,*p2 ; p1,p2 的指向如图所示。, p1=NULL 判断p1是否为空指针?(NULL是系统定义的) 结果:0,计算: p1=p2 判断p1,p2是否指向同一变量? 结果:0, p1p2 判断p1的地址是否比p2的地址小? 结果:1, p1!=0 判断 p1 是否不为空指针? 结果:1,指针与引用,自学内容:指向多维数组的指针、字符串与指 针、函数与指针、返回指针值的函 数、指针数组和指向指针的指针。,指针与引用,有关指针的小结,int *p; 一般指针,可与一维数组名等价。 int (*p)M; 指向含有 M 个元素的一维

17、数组, 可与二维数组名等价。 int *pM; 指针数组,有M个元素,每个元素都是指针。 int *p; 指向指针的指针。 int (*p)(int, int); 函数指针,指向参数是两个整型值、 并且返回整型值的函数。 int *p( ). 返回整型指针值的函数。,指针与引用,引用,例:int a; int ,意义:给变量 a 定义了一个别名 ref 。,例:int a; int ,输出:88 1010,指针与引用,例3.9,输出?,指针与引用,指针与引用,注意事项:,一个变量可定义多个引用: int i; int ,可定义引用的引用: int i; int ,不能将数组定义为引用,但可为数组元素定义引用 int a10; int ref2 a5,指针与引用,例3.10,输出?,指针与引用,使用引用作参数, 增强程序的可读性和编程的方便性。,作 业 (课堂),1、读程序写结果,作 业 (课堂),作 业 (课堂),2、读程序写结果,作 业 (课堂),作 业 (课堂),3、编写完整的C+程序(包括程

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论