
vc05数组与指针.ppt
65页第5章 数组与指针Date1《面向对象程序设计与Visual C++6.0教程》● C++为组织这种大量相似而又有一定联 系、或者相互之间具有一定关联的数据 提供了一种高效的数据组织形式——数 组;●对于复杂数据的组织方式,C++还提供 了另一个重要方法——指针 数组与指针概述Date2《面向对象程序设计与Visual C++6.0教程》本章主要内容: ●数组的定义及应用 ●数组作为函数参数及对象数组 ●指针的定义及应用 ●指针的运算 ●指针与数组 ●指针与函数 ●指针与字符串 ●对象指针 ●动态内存分配Date3《面向对象程序设计与Visual C++6.0教程》5.1 数组 ●数组是由具有一定数量的同类数据(包括 基本类型数据及类类型等)顺序排列而成 的集合, ●组成数组的任一数据称为该数组的元素 ●数组在内存中占有一片连续的存储空间 ●数组可以由除void型以外的任何一种类型 构成 Date4《面向对象程序设计与Visual C++6.0教程》1.一维数组 ●数组由数组名标识符、下标及数组所表 示的数据类型等要素组成●若数组有n个下标,则表示该数组为n维 数组。
数组元素用数组名及带方括号的 下标表示 Date5《面向对象程序设计与Visual C++6.0教程》(1) 一维数组的定义与使用 数据类型 数组名 [常量表达式]; 一维数组的定义形式如下: Date6《面向对象程序设计与Visual C++6.0教程》●数据类型表示数组元素值的类型,可以是除void 类型以外的任意符合C++规定的数据类型;●数组名的命名应遵循C++标识符规则;●数组名表示数组元素在内存中的起始地址;●数组名后必须用方括号,不能用其他括号;●数组元素的数量由常量表达式的值决定,这个 值必须在编译时确定;● 数组元素的起始标号为0定义数组时需注意 Date7《面向对象程序设计与Visual C++6.0教程》一维数组及高维数组的元素只能 逐个引用,而不能一次性的引用整个 数组引用形式为:数组名 [下标]一维数组元素的引用Date8《面向对象程序设计与Visual C++6.0教程》(2) 一维数组的初始化 ●在定义数组的同时应对数组进行初始化●对于简单数据类型的数组,初始化就是给数 组元素赋值;●对于复杂类型如对象数组等,由于每个元素 都是类的一个对象,因此初始化就是调用该 对象的构造函数。
Date9《面向对象程序设计与Visual C++6.0教程》初始化举例●数组初始化可以在定义数组的同时进行, 例如:int a[5]={1,2,3,4,5}; ●数组初始化可以在定义数组的同时进行,例如:int a[5]={1,2,3,4,5}; ●也可只对数组中的部分元素进行初始化,比如:int a[8]={1,2,3,4,5}; Date10《面向对象程序设计与Visual C++6.0教程》(3) 一维数组的存储方式 ●无论是一维数组还是多维数组,其数组元 素在内存中以顺序和连续方式存储,占据一片 连续的存储单元;●数组名是常量,表示数组首元素的内存首 地址;●一维数组是数组中最简单的情况它的存 储形式是按下标从小到大的顺序连续存储在内 存中 Date11《面向对象程序设计与Visual C++6.0教程》一维数组的存储结构array[0] array[1] ┇ array[99]array图5-1 一维数组的存储结构 例如:若定义如下数组 int array[100]; Date12《面向对象程序设计与Visual C++6.0教程》●数组元素和数组名都可以作为函数的参数进 行数据的传递。
●如果使用数组名作为函数参数,则实参和形 参都应该是数组名,且类型应相同 ●使用数组名作为函数参数,传递的是地址 形参数组和实参数组的首地址相同●如果在被调用函数中对数组元素的值进行改 变,主调函数中实参数组的相应元素值也会相 应改变 (4) 一维数组作为函数参数 Date13《面向对象程序设计与Visual C++6.0教程》l具有一个下标的数组是一维数组,若数 组有2个下标,则表示二维数组2. 二维数组 Date14《面向对象程序设计与Visual C++6.0教程》(1) 二维数组的定义与使用 二维数组的定义形式如下: 数据类型 数组名 [常量表达式1] [常量表达式2];Date15《面向对象程序设计与Visual C++6.0教程》二维数组元素的引用二维数组及高维数组的元素也只 能逐个引用,而不能一次性的引用整 个数组二维数组元素的引用形式为 : 数组名 [下标][下标]Date16《面向对象程序设计与Visual C++6.0教程》(2) 二维数组的初始化 与一维数组类似,二维数组也 可以在定义数组的同时进行初始化 例如: int a[2][3]={1,2,3,6,7,8}; //直接给出常数表 int a[2][3]={{1,2,3},{6,7, 8}};//按维给出常数表 Date17《面向对象程序设计与Visual C++6.0教程》●二维及高维数组的数组元素在内存中以 高维优先的方式顺序连续存储。
●对于二维数组,高维优先就是行优先, 即按行存储,先存储第一行,然后存储第二 行,……●而每一行内的各元素,则与一维数组相 同,按列下标(低维下标)从小到大的顺序 存储3) 二维数组的存储方式 Date18《面向对象程序设计与Visual C++6.0教程》●二维及高维数组的数组名也可以作为函 数参数进行数据传递和数据共享;●使用二维数组名作为函数参数时,实参 和形参也都应该是数组名,且类型相同;●使用数组名传递数据时,传递的是数据 在内存中的存储地址4) 二维数组作为函数参数 Date19《面向对象程序设计与Visual C++6.0教程》3. 对象数组 ●对象数组是指数组元素为类对象的数组 ●对象数组的元素不仅包括数据成员,而 且还包括成员函数 Date20《面向对象程序设计与Visual C++6.0教程》(1)对象数组的定义 类名 数组名[下标表达式];数组名[下标].成员名; 对象数组的引用:对象数组的引用:Date21《面向对象程序设计与Visual C++6.0教程》●对象数组元素的初始化需要遵循类对象的初 始化原则 ●对象数组初始化时,每一个元素(对象)都 需要调用构造函数。
●若定义数组时给每一个数组元素显式给定初 始值,需要调用相应带形参的构造函数例如:Point A[2]={Point(3,4),Point(12,18)} ●在初始化时会先后两次调用带形参的构造函 数分别初始化A[0]和A11] (2) 对象数组的初始化 Date22《面向对象程序设计与Visual C++6.0教程》●指针是C++语言的重要内容,它提供了一种 直观的地址操作方法; ●利用指针既可以直接对内存中的各种不同数 据结构的数据进行快速有效处理; ●可以为函数间各种数据的传递提供了简捷、 便利的方法; ●使用指针,可以方便、灵活、有效的组织和 表示复杂的数据结构; ●指针使用不当,将可能导致系统崩溃 5.2 指针 Date23《面向对象程序设计与Visual C++6.0教程》●计算机内存单元按一定的规则进行编号, 这个编号如同房间号和门牌号一样,可以标 定计算机内存单元的物理位置,通常称为存 储单元的地址; ●计算机内存单元地址编码的基本单位是字 节,每个字节由8位组成; ●每个字节都有一个地址计算机通过这个 地址对内存数据进行管理1. 内存空间的访问方式 Date24《面向对象程序设计与Visual C++6.0教程》●在计算机中,变量的地址指示了 该变量在内存中的位置,形象的称 地址为指针。
●专门用于存放内存单元地址的变 量,称为指针变量 内存空间的访问方式(续)Date25《面向对象程序设计与Visual C++6.0教程》2. 指针变量的定义 ●指针也是一种数据类型,具有指针类型的 变量称为指针变量; ●指针变量中存放的不是一般的数据,而是 数据在内存中的地址;●指针也必需先定义,后使用; ●定义指针的语法形式如下: 数据类型 *指针变量名;Date26《面向对象程序设计与Visual C++6.0教程》指针变量定义举例例如:int *p1;double *p2;char *p3;void *p4;以上语句分别定义了一个指向整型 变量、双精度实型变量、字符型变量的 指针p1、p2、p3和void型指针p4 Date27《面向对象程序设计与Visual C++6.0教程》指针变量具有以下特点: ●指针定义时所指的数据类型,是即指针所指向的 数据类型;●指针本身的数据长度由编译系统决定,指针变量 本身的值都默认是unsigned long int型; ●定义指针变量必须使用符号“*”,表明它后面的 变量是指针变量;● 指针变量在未赋初值时不指向任何地址;● 一个指针变量只能指向同一类型的变量,不能 既指向整型变量又指向实型变量;● void型指针所指向的数据类型由初始化情况决 定。
没有被初始化的void型指针变量不指向任何一个 确定的数据类型 Date28《面向对象程序设计与Visual C++6.0教程》3. “*”和“ 则以下都是二维数组元素a[i][j]的表示方法:*(a[i]+j);*(*a+i)+j;*(a+i)[j];(a+4*i+j);*(*(p+i)+j);*(p[i]+j);*(p+i)[j];p[i][j];Date38《面向对象程序设计与Visual C++6.0教程》3. 指针数组 数据类型 *指针数组名[常量表达式]; ●指针数组是指数组的每个元素都是指针变量的 数组 ●一维指针数组的定义形式如下: ●高维指针数组的定义形式类推 Date39《面向对象程序设计与Visual C++6.0教程》5.5 指针与函数 ●函数与指针有密切的联系;●函数名实际上就是函数代码在内存中的起 始地址;●若函数调用中需要传递大量的数据时,利 用指针作为函数参数不仅可以传递大量数 据,而且可以大大降低系统开销 Date40《面向对象程序设计与Visual C++6.0教程》1. 指针作为函数参数 函数参数可以是:●变量 ●类对象●数组名●函数名●指针 Date41《面向对象程序设计与Visual C++6.0教程》指针作为函数参数的优点●可以实现数据的双向传递;●如果被传递的数据是存放在一个连续的内存空 间,就可以采用指针作为函数参数,传递大量数 据,降低系统开销; ●函数调用中如果以指针作为形参,则对形参指 针所指向的变量值的改变就是对实参指针所指向 的变量的改变。
Date42《面向对象程序设计与Visual C++6.0教程》2. 指针型函数 ●指针可以是函数的返回值; ●当一个函数的返回值是指针类型时,这个 函数称为指针型函数; ●通常情况下,非指针型函数只能返回一个 数据; ●对于指针型函数,通过对存储空间的有效 组织,则可以向主调函数返回大量的数据Date43《面向对象程序设计与Visual C++6.0教程》指针型函数的一般定义形式: 数据类型 *函数名(参数表) {函数体 }数据类型是函数返回的指针所指向数据的类 型,函数名和“*”表明定义了一个指针型的函数 Date44《面向对象程序设计与Visual C++6.0教程》3.指向函数的指针 指向函数的指针即所定义的指 针是专门用于存放函数代码首地址 的指针,又称为函数指针 Date45《面向对象程序设计与Visual C++6.0教程》例如:int (*funp)();函数指针定义形式: 数据类型 (*函数指针名) (参数表)Date46《面向对象程序设计与Visual C++6.0教程》5.6 指针与字符串 ●在C++程序中,既可以定义一个字符数组 用于存储字符串,通过。
