




已阅读5页,还剩34页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C 语言程序设计基础 第6章数组 指针和字符串 6 1数组6 2指针6 3动态内存分配6 4用vector创建数组对象6 5深复制和浅复制6 6字符串 6 1数组 1 一维数组 inta 3 2 charb 3 constintSIZE 10 intm SIZE 数组元素的表示 为常量表达式 从0开始 各个元素在内存中按其下标的升序顺序连续存放数组元素的初始化inta 3 1 2 3 b 4 6 7 c 2 多维数组 inta 3 4 doubleb 2 3 4 数组元素的表示 各个元素在内存中连续存放数组元素的初始化intd 2 3 1 2 3 4 5 6 intd 2 3 1 2 3 4 5 6 inta 2 3 1 2 3 思考 a 0 0 a 1 0 a 2 0 a 0 0 a 0 1 a 0 2 a 0 3 a 2 0 a 2 1 a 2 2 a 2 3 a 2 3 a 0 0 练习 a i j 是二维数组中的第几个元素 二维数组a 3 4 6 1 3数组作为函数参数 voidfun intb intn for inti 0 i n 1 i b 7 b i intmain inta 8 1 3 5 7 9 11 13 m 8 fun a m cout a 7 endl return0 数组练习 一维数组 编写函数 实现对给定数组中的元素逆序 二维数组 打印杨辉三角 6 1 4对象数组 对象数组CDatedate 31 date 0 SetDate 2012 10 1 date 0 PrintDate 对象数组的初始化CDatea 2 CDate 2050 10 1 CDate 2050 10 2 CDatea 2 a 0 CDate 2050 10 1 a 1 CDate 2050 10 2 6 2指针 6 2 1内存空间的访问方式声明变量 分配内存指针是变量在内存中起始地址变量的地址 注 实际应用中更多的是通过 引用变量的指针 而很少关心指针的实际值 6 2 2指针变量的声明 指针声明时指定的数据类型是指针所指向目标的数据类型一个指针变量只能指向数据类型指定的同一类型的变量 表示变量为指针变量指针变量在使用前一定要先赋值后使用char pName int px 6 2 4指针的赋值 inta 1 p1 给p2所指向的变量赋值 1 2 3 6 2 5指针运算 一个指针可以加或减一个整数ndoublea 10 p a p指向a 0 p p 3 p指向a 3 p 6 2 6用指针处理数组元素 统计输入字符串的字符个数intmain charstr 20 pc str cout pc while pc 0 pc cout ThestringLength pc str endl return0 6 2 8用指针作为函数参数 编写函数 将浮点数的整数部分和小数部分分离返回 voidsplitFloat floatx int intPart float fracPart intPart static cast x 取x的整数部分 fracPart x intPart 取x的小数部分 6 2 11对象指针 1 对象指针的一般概念 CDated pd pd pd ypd y pd SetDate 2012 8 8 pd SetDate 2012 8 8 2 this指针 this是一个隐含于每一个类内非静态成员函数中的特殊指针用于指向正在操作该成员函数的对象this是指向自己的指针 this就是自己 classM public M a b 0 M inti intj a i b j voidcopy M 3 指向类的非静态成员的指针 指向数据成员的指针 指向成员函数的指针 classA public A inti a i intfun intb returna c b intc private inta intA pc 指向类A的成员函数fun的指针pfun 6 3动态内存分配 1 new运算符申请一个变量的存储空间 new double px px newdouble 申请一个带初始化的内存空间 new float py py newfloat 10 5f 申请某个数据类型的一个匿名数组 new int pa pa newint 5 2 delete运算符 delete delete 说明 delete作用的指针对象必须由new分配的内存空间的首地址 对于一个已分配内存的指针 只能用delete释放一次 intmain double px int pz px newdouble px 66 84 cout px endl pz newint 3 for inti 0 i 3 i pz i i cout pz i deletepx delete pz return0 将动态数组封装成类 更加简洁 便于管理建立和删除数组的过程比较繁琐封装成类后更加简洁 便于管理可以在访问数组元素前检查下标是否越界用assert来检查 assert只在调试时生效 20 动态数组类 include includeusingnamespacestd classPoint public Point x 0 y 0 intgetX const returnx intgetY const returny voidmove intnewX intnewY x newX y newY private intx y 21 classArrayOfPoints 动态数组类 public ArrayOfPoints intsize size size 同名只能在初始化列表赋值 points newPoint size ArrayOfPoints delete points Point 22 intmain intcount cout count ArrayOfPointspoints count 创建对象数组points element 0 move 5 0 通过访问数组元素的成员points element 1 move 15 20 通过类访问数组元素的成员return0 23 6 4用vector创建数组对象 为什么需要vector 将动态数组封装 自动创建和删除数组下标越界检查vector动态数组对象的定义vector数组对象名 数组长度 例 vectorarr 5 建立大小为5的int数组 24 vector数组对象的使用 对数组元素的引用与普通数组具有相同形式 数组对象名 下标表达式 但vector数组对象名不表示数组首地址获得数组长度用size函数数组对象名 size 25 vector应用举例 include includeusingnamespacestd 计算数组arr中元素的平均值doubleaverage constvector 26 intmain unsignedn cout n vectorarr n 创建数组对象cout arr i cout Average average arr endl return0 27 6 5深复制与浅复制 深复制 如果一个类的数据成员需要使用动态分配的堆资源 并且这个类的对象之间发生了数据成员拥有的堆资源复制过程 这个过程就可以叫深复制浅复制 对象存在数据成员拥有堆资源但复制过程并未实现数据成员拥有堆资源的复制情况视为浅复制 include includeclassCPerson public CPerson char str cout Construct str endl name newchar strlen str 1 strcpy name str CPerson cout Destruct name endl delete name private char name voidmain CPersonp1 Randy p2 p1 编译正确 运行时产生错误 浅复制 classCPerson public CPerson char str cout Construct str endl name newchar strlen str 1 strcpy name str CPerson CPerson 深复制 6 6 1用字符数组存储和处理字符串 字符串常量 例 program 各字符连续 顺序存放 每个字符占一个字节 以 0 结尾 相当于一个隐含创建的字符常量数组 program 出现在表达式中 表示这一char数组的首地址首地址可以赋给char常量指针 constchar STRING1 program 字符串变量可以显式创建字符数组来表示字符串变量 例如 以下三条语句具有等价的作用 charstr 8 p r o g r a m 0 charstr 8 program charstr program 31 字符数组练习 编写一函数 用于删除字符串中的给定字符 函数原型为 intdelete chars charc 如 若s字符串为 abcaabcabcda 要删除的字符为 a 则删除后的字符串为 bcbcbcd 用字符数组表示字符串的缺点 用字符数组表示字符串的缺点执行连接 拷贝 比较等操作 都需要显式调用库函数 很麻烦当字符串长度很不确定时 需要用new动态创建字符数组 最后要用delete释放 很繁琐字符串实际长度大于为它分配的空间时 会产生数组下标越界的错误解决方法使用字符串类string表示字符串string实际上是对字符数组操作的封装 33 6 6 2string类 常用构造函数string 缺省构造函数 建立一个长度为0的串string constchar s 用指针s所指向的字符串常量初始化string类的对象string conststring 执行拷贝构造函数 用s2的值作为s3的初值 34 string的用法 常用操作符s t将串s和t连接成一个新串s t用t更新ss t判断s与t是否相等s t判断s与t是否不等st判断s是否大于t 按字典顺序比较 s t判断s是否大于或等于t 按字典顺序比较 s i 访问串中下标为i的字符例 strings1 abc s2 def strings3 s1 s2 结果是 abcdef bools4 s1 s2 结果是truechars5 s2 1 结果是 e 35 36 例6 23string类应用举例 include includeusingnamespacestd 根据value的值输出true或false title为提示文字inlinevoidtest constchar title boolvalue cout title returns value true false endl intmain strings1 DEF cout s2 cout lengthofs2 s2 length endl 比较运算符的测试test s1 ABC s1 ABC test DEF s1 DEF s1 连接运算符的测试s2 s1 cout s2 s2 s1 s2 endl cout lengthofs2 s2 length endl return0 37 用getline输入整行字符串 输入整行字符串用cin的 操作符输入字符串 会以空格作为分隔符 空格后的内容会在下一回输入时被读取用string头文件中的getline可以输入整行字符串 例如 getline cin s2 以其它字符作为分隔符输入字符串输入字符串时 可以使用其它分隔符作为字符串结束的标志 例如逗号 分号 把分隔符作为getline的第3个参数即可 例如 getline cin s2 38 例6 24用getline输入字符串
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 离异父母子女抚养费用及生活费用支付协议
- 离婚协议彩礼退还与房产分割执行范本
- 车辆抵押贷款业务业务流程优化与风险控制服务合同
- 短途接送服务合同范本含司机专业操作标准
- 离婚协议中包含子女学业资助与成长保障
- 装修合同签订前合同主体资格审核要点
- 离婚协议中虚拟货币分割与风险控制协议样本
- 人物花瓶黏土课件
- 辽沈战役精简课件
- 个人有关事项培训
- 古诗词诵读教学设计与实施方案
- 2025年山东省政府采购评审专家考试题库附含答案
- 眼镜验光师试题(及答案)
- 第二章 有理数的运算 单元测试(含解析)2025-2026学年人教版(2024)数学七年级上册
- 重庆市南开中学高2026届高三第一次质量检测+数学答案
- 家政入股分红合同协议书
- 2025年家政服务员工作技能考试试题及答案解析
- 2025年安全生产责任主体考试题及答案
- 2025年全国保密教育知识竞赛题库附答案
- 2025年医疗器械注册与监管考试试题及答案解析
- 安全员a证考试试题库及答案
评论
0/150
提交评论