




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第六章 数组、指针与字符串,本章主要内容,数组 指针 动态存储分配 字符串:/自学 深拷贝与浅拷贝/后面专题讲解,注意存储格式和长度,数组,数组的概念 数组的定义与使用 数组作为函数参数 对象数组,返 回,数组的概念,书上定义:数组是具有一定顺序关系的若干相同类型对象的集合体,组成数组的对象称为该数组的元素。 注: 数组属于构造类型 数组可用于实现线性表的顺序存储 元素类型是除void之外的任何类型,返 回,数组的定义与使用,定义格式:数据类型 数组名常量表达式1常量表达式2 常量表达式3 使用:访问数组元素 数组名下标表达式1 下标表达式2下标表达式3 例: int A34; A23=9;,
2、注意:,数组下标从0开始 数组定义中的每一维的大小应是常量 如:int k9;int Ak; /编译时会出错!Why? 数组元素按行序优先进行存储,注意多维数组的情形 数组元素可以在定义时初始化,初始化也可以以行为单位进行初始化,下页例子:,数组元素可以在定义时初始化,分行给二维数组赋初值 例如:static int a34=1,2,3,4,5,6,7,8,9,10,11,12; 将所有数据写在一个内,按顺序赋值 例如:static int a34=1,2,3,4,5,6,7,8,9,10,11,12; 可以对部分元素赋初值 例如:static int a34=1,0,6,0,0,11;,返
3、回,数组作为函数参数,情形一:数组元素作实参 与处理单个变量相同 情形二:数组名作参数 形、实参数都应是数组名,类型要一样,传送的是数组首地址。对形参数组的改变会直接影响到实参数组,是传数组首地址调用,如何看到传递参数的方式,传值、传地址?,例:,int A5=1,2,3,4,5; void access_elem(int x)coutxendl; void access_array(int A, int n) A0=9; for(int i=0;In;i+)coutAi; coutendl; Void main() int A5=1,2,3,4,5; Access_elem(A3); Acc
4、ess_array(A,5);cout“A0=:”A0endl; ,或者*(Ai),返 回,对象数组,定义:类名 数组名元素个数; 访问方法:通过下标访问 数组名下标.成员名 例: Point P_ay10; P_ay1.x=1; P_ay1.y=2;,对象数组初始化,数组中每一个元素对象被创建时,系统都会调用构造函数初始化该对象。 通过初始化列表赋值。 例:Point A2=Point(1,2),Point(3,4); 如果没有为数组元素指定显式初始值,数组元素便使用缺省值初始化(调用缺省构造函数)。,构造函数与数组,数组元素所属类的构造函数,各元素对象的初值要求为相同的值时,可以声明具有缺
5、省形参值的构造函数。 各元素对象的初值要求为不同的值时,需要声明带形参(无缺省值)的构造函数。 当数组中每一个对象被删除时,系统都要调用一次析构函数。,下页举例,例6-3 对象数组应用举例(P155),/Location.h #if !defined(_LOCATION_H)/这样条件编译的目的 #define _LOCATION_H class Location public: Location( ); Location(int xx,int yy); Location( ); void Move(int x,int y); int GetX( ) return X; int GetY( )
6、 return Y; private: int X,Y; ; #endif,/Location.cpp #include #include Location.h Location:Location( ) X=Y=0; coutDefault Constructor called.endl; /显示构造信息 Location:Location(int xx,int yy) X=xx; Y=yy; cout Constructor called.endl; ,Locatuon:Location( ) coutDestructor called.endl;/显示析构信息 void Location:
7、Move(int x,int y) X=x; Y=y; ,int main( ) coutEntering main.endl; Location A2; for(int i=0;i2;i+) Ai.Move(i+10,i+20); coutExiting main.endl; return 0; ,运行结果: Entering main. Default Constructor called. Default Constructor called. Exiting main. Destructor called. Destructor called.,返 回,指针,指针的定义与使用 二种特殊
8、类型的指针 指针运算 指针的其它用法(包含结合对象的部分),返 回,1.指针的定义与使用,定义:数据类型 * 指针名; 使用: 1.初始化 指针名地址(如:,返 回,2 .指针的特殊用法,指向常量的指针和常量指针(指针常量) 指向常量:const 类型符 * 指针名;常量对象不可改变 常量指针:类型符号 * const 指针名;指针值不可改变,int j=300; const int i=100;/定义成int const i;也可以 const int * p1=/+*p1出错!,2.void 类型指针,void 类型指针是一种特殊的指针: (1) 能指向任何数据类型 (2)可以通过C+中的
9、强制转换用以赋值给向其它数据类型的指针。,例:,void * p; int i=9; p=,Error!不允许直接输出void 类型指针所指向的变量的值, 需要类型转换,int j; void *pp=,1.用变量地址作为初值时,该变量必须在指针初始化之前已说明过,且变量类型应与指针类型一致。 2.可以用一个已赋初值的指针去初始化另一 个指针变量。 3.建议在定义指针变量的同时,进行初始化。,注意:,返 回,指针运算,赋值运算 关系运算 =、 算术运算: 结合数组的指针运算,数组的指针方式访问 指针数组,基本指针运算,返 回,指针运算赋值运算,能将一个确切的内存地址值赋给指针,不能是普通整数。
10、但可以赋值为整数0,表示空指针。,例: int i=9; int *p1=,但下面形式出错: int i=0; int *p3=i;/类型不匹配,整形与整形指针,返 回,指针运算关系运算,可以实施= 、!=、等基本关系运算 基本前提:参加运算的指针类型相同 意义:1.判断地址的高低。 2.判断指针是否是空指针,运行结果: p=:0 x0012FF50 ip=:0 x0012FF54 p ip,int * p,*ip; int a10; p=a;ip=a+1; coutp=:p ip=:ipendl; if(pip)coutp ipendl;,返 回,指针运算算术运算(、),1. 指针与整数的加
11、减运算 指针 p 加上或减去 n ,其意义是指针当前指向位置的前方或后方第 n 个数据的地址。运算的结果值取决于指针指向的数据类型 2.指针加一,减一运算 指向下一个或前一个数据。 例如:y=*px+ 相当于 y=*(px+) (*优先级低于后置+,自右向左运算),注:可以通过数组来说明,返 回,指针运算结合数组的指针运算,数组的指针表示方法 定义数组,数组名是一个指向数组元素的指针。 定义n维数组,具有灵活的指针表示方法。 如定义:int a5=1,2,3,4,5; 则有: *a=a0,*(a+1)=a1, ,*(a4)=a4 如定义:int a55; 则有: *a=a00; *(a+1)=
12、a10; *(*(a+1)1)= a11;,注意:不能写 a+或+a,因为a是数组首地址,是常量右值的问题,返 回,指针运算指针数组,定义:数组元素是指向相同数据类型的指针 格式:类型名 * 数组名下标表达式,例:,char * ptch3=abc,def,ghi; cout1th pointer is: ptch0endl; cout1th pointer is: ptch1endl; cout1th pointer is: ptch2endl; cout1th pointer is: *ptch0endl; cout1th pointer is: *ptch1endl; cout1th p
13、ointer is: *ptch2endl;,1th pointer is: abc 2th pointer is: def 3th pointer is: ghi 1th pointer is: a 2th pointer is: d 3th pointer is: g Press any key to continue,运行结果:,指针的几点建议,指针是C中的精华,也是难点,灵活运用能提高程序的运行效率,不正确的使用能埋下巨大的隐患 指针在定义时最好进行初始化,或者置空 能不用指针的情形下避免使用指针,指针的其它运用,指针作函数参数 返回指针的函数 指向函数的指针简单介绍 4. 对象向指针
14、:,指向对象 指向类成员/选学、自学,简单回忆,返 回,指向函数的指针,定义格式: 数据类型 (*函数指针名)(函数形参表 ); 功能:指针指向函数代码的入口地址,利用指针实现程序流程的转向,例: void test(int a)coutonly a test for out : ax=x; this-y=y; float getx()return x; /或者 return this-x; private: float x,y; ;,注意this指针的用法,提问:如不用this会出现什么情形? 为什么?,返 回,指向对象成员,指向非静态成员:定义时要加上域运算符 指向静态成员:用普通格式定义
15、指针 举例 .* 或-*是point to member运算符,返 回,为什么要分静态与非静态?,指向非静态公有成员,定义格式:(与静态不同) 数据成员指针: 数据类型 类名:*指针名 函数成员指针: 数据类型 (类名:*指针名) (参数表 ) 初始化: (与静态相同) 数据成员指针:指针名=/静态数据成员 int b; /普通数据成员 static void out_st() /静态函数成员 coutoutput static func a=:aendl; ; void out()/普通函数成员 coutoutput comm func a=:a b=:b*,C+ allows you to
16、 generate a special type of pointer that “points” generically to a member of a class, not to a specific instance of that member in an object. This sort of pointer is called a pointer to a member, or pointer-to- member, for short. A pointer to a member is not the same as a normal C+ pointer. Instead,
17、 a pointer to a member provides only an offset into an object of the members class at which that member can be found. Since member pointers are not true pointers, the . and operators cannot be applied to them. To access a member of a class given a pointer to it, you must use the special pointer-to-m
18、ember operators .* and *. They allow you to access a member of a class given a pointer to that member. When you are accessing a member of an object given an object or a reference to an object, use the .* operator. When accessing a member given a pointer to an object, use the * operator. A pointer to
19、 a member is declared by using the general form shown here: type class-name:*ptr; Here, type is the base type of the member, class-name is the name of the class, and ptr is the name of the pointer-to-member variable being created. Once created, ptr can point to any member of its class that is of this
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 生物制药废弃物处理与环保技术探索考核试卷
- 乐器制作中的声学实验研究方法考核试卷
- 图像风格迁移与编辑考核试卷
- 纺织品行业职业健康法规解读考核试卷
- 家电行业绿色制造投资与成本效益分析考核试卷
- 广告效果评估与营销策略优化考核试卷
- 2025年中国ODA树脂数据监测研究报告
- 2025年中国GPS三联母钟数据监测研究报告
- 2025年中国CNC雕铣机数据监测研究报告
- 2025至2030年中国铠装移开式金属封闭开关设备市场分析及竞争策略研究报告
- 01S201室外消火栓安装图集
- 银铅锌矿开采项目可行性研究报告
- 甲状腺癌的围手术期护理
- 2023年副主任医师(副高)-结核病学(副高)考试历年高频考点试题摘选附带含答案
- 仁爱初中英语九上教案设计u3t1sa
- 类证普济本事方续集
- 紧急救护知识培训ppt
- LY/T 1279-2020聚氯乙烯薄膜饰面人造板
- GB/T 879.2-2018弹性圆柱销直槽轻型
- GB/T 24218.2-2009纺织品非织造布试验方法第2部分:厚度的测定
- GA/T 1144-2014信息安全技术非授权外联监测产品安全技术要求
评论
0/150
提交评论