面向对象技术(CPrimer)第4章.ppt

上传人:max****ui 文档编号:3286443 上传时间:2019-12-11 格式:PPT 页数:38 大小:1.46MB
返回 下载 相关 举报
面向对象技术(CPrimer)第4章.ppt_第1页
第1页 / 共38页
面向对象技术(CPrimer)第4章.ppt_第2页
第2页 / 共38页
面向对象技术(CPrimer)第4章.ppt_第3页
第3页 / 共38页
点击查看更多>>
资源描述
第四章数组和指针1,数组与vector类型相似,也可以保存某种类型的一组对象。区别在于数组的长度是固定的。数组一经创建,就不允许添加元素。程序员无法知道一个给定数组的长度。指针可以像迭代器一样用于遍历和检查数组中的元素。使用指针很容易出错。与容器和迭代器相比,依赖于数组和指针的程序更容易出错。现代C+程序更多使用vector代替数组。数组被严格限制使用,只有当测试性能表明用vector达不到性能要求时,才使用数组。,4.1数组的定义和初始化2,数组是由类型名、标识符和维数组成的复合数据类型。类型名规定了存放在数组中的元素的类型维数指定了数组中包含的元素的个数。必须用值大于等于1的常量表达式定义。constunsignedbuf_size=512,max_files=20;intstaff_size=27;/conconstconstunsignedsz=get_size();/constvaluenotknown/untileruntimecharinput_bufferbuf_size;/ok,constvariablestringfileTalbemax_files+1;/ok,constantexpressiondoublesalariesstaff_size;/error,nonconstvariableinttest_scoresget_size();/error;nonconstexpressioninttest_scoresget_size();/error;nonconstexpressionintvalssz;/error;sizenotknownuntiolruntime,数组初始化3,1.显式初始化数组元素constunsignedarr_size=3;intiaarray_size=0,1,2若无显式初始化,则:在函数体外定义的内置数组,无素均为0.函数体内定义的内置数组,元素无初始化若元素为类类型,无论在那里定义,则自动调用该类的默认构造函数进行初始化。如果该类没有默认构造函数,则必须为该数组的元素提供显式初始化。,4,Intia=0,1,2;/anarrayofdimension3Constunsignedarray_size=5;Intiaarray_size=0,1,2;/ia=0,1,2,0,0Stringstr_arrarr_size=“hi”,”bye”;/str_arr=“hi”,”bye”,”,”,”,特殊的字符数组5,charca1=C,+,+;/nonullCharca2=C,+,+,0;/explicitnullCharca3=“C+”;/nulladdedautomaticlConstcharca36=“Daniel”;/error,is/7elements,数组不能直接复制和赋值6,与vector不同,一个数组不能用另外一个数组初始化,也不能将一个数组赋值给另一个数组。Intia=0,1,2;/ok,arrayofintsIntia2(ia);/error,cannotinitializeany/arraywithanotherIntmain()constunsignedarray_size=3;intia3array_size;/ok,buteleareunintializeia3=ia;/error,cannotassignonearaytoanotherreturn0;,数组操作7,数组元素可用下标操作符访问。从0开始。Vector的下标类型为vector:size_type,数组的下标类型为size_tIntmain()constsize_tarray_size=10;intiaarray_size;/10intsfor(size_tix=0;ix!=array_size;+ix)iaix=ix;return0;,8,Intmain()constsize_tarray_size=7;intia1=0,1,2,3,4,5,6;intia2array_size;/local,eluninitial/copyelementformia1toia2for(size_tix=0;ix!=array_size;+ix)ia2ix=ia1ix;return0;,4.2指针的引入9,指针是指向某种类型对象的复合数据类型,是用于数组的迭代器:指向数组中的一个元素。可使用解引用操作符*和自增操作符。指针用于指向对象。指针保存的是另一个对象的地址:strings(“helloworld”);string*sp=/spholdstheaddresofs,建议:尽量避免使用指针和数组10,由于指针和数组容易产生不可预料的错误,其中一部分是概念上的问题,指针用于低纵级操作,容易产生与繁琐细节相关的错误。其他错误则源于使用指针的语法规则,特别是声明指针的语法。许多有用的程序都可不使用指针和数组实现。现代C+程序采用vector类和迭代器取代一般数组、采用string类取代C风格字符串。,指针的定义和初始化11,vector*pvec;/pveccanpointtoa/vectorint*ip1,*ip2;/ip1andip2canpointtointstring*pstring;/pstringcanpointtoastridouble*dp;/dpcanpointtoadouledoubledp,*dp2;/dp2isapointer另一种风格的指针:string*ps;/legalbutcanbemisleadingString*ps1,ps2;/ps1ispointertostr,ps2isstiString*ps1,*ps2;/bothps1andps2arepointer,指针可能的取值12,指针的状态:保存一个特定对象的地址;指向某个对象后面的另一个对象;或者是0值,表示不指向任何对象。intival=1024;int*pi=0;/piinitializedtoaddressnoobjint*pi2=/pi2notaddresstonoobject,指针初始化和赋值操作的约束13,对指针进行初始化或赋值只能用以下四种1.0值常量表达式。如在编译时可获得0值的整形const对象或字面值常量0.2.类型匹配的对象的地址。3.另一个对象之后的下一地址。4.同类型的另一个有效指针。,14,intival;intzero=0;constintc_ival=0;int*pi=ival;/error,initialfromintvaluePi=zero;/error,piassignedintvalueof0Pi=c_ival;/ok,c_ivalisaconstwithcomple-timevalueof0pi=0;/ok,directlywithlitealconstant0Int*pi=NULL;Doubledval;Double*pd=/error,void*指针15,void*指针可以保存任何类型的对象地址。doubleobj=3.14;double*pd=/pdcanbeapointertoanytypeVoid*指针支持的操作:与另一指针比较向函数传递void*指针或从函数返回void*指针给另一个void*指针赋值,4.2.3指针操作16,指针提供间接操纵其所指对象的功能。stirngs(“helloworld”);string*sp=/printshelloworld,给指针赋值或通过指针赋值17,如果对左操作数进行解引用,则修改的是指针所指对象的值。如果没有使用解引用,则修改的是指针本身的值。strings1(“somevalue”);string*sp1=/sp1pointtoadifferentofjbect,指针和引用的比较18,引用总是指向某个对象,定义引用时没有初始化是错误的。指针可以指向不同的对象。赋值行为的差异:给引用赋值修改的是该引用所关联的对象的值。指针赋值使指针指向另一个对象。,19,intival=1024,ival2=2048;int*pi=/asignsival2toival,指向指针的指针20,intival=1024;int*pi=,4.2.4使用指针访问数组元素21,指针是数组的迭代器。Intia=0,2,4,6,8;Int*ip=ia;/iippointstoia0Ip=/ok,ip2pointtoia4,22,ptrdiff_tn=ip2-ip;/ok,distanbetweenthemintlast=*(ia+4);/equaltoia4intlast=*ia+4;/ok,last=4intia=0,2,4,6,8inti=ia0;/iapointtothefirstelementint*p=/ok,p-2=ia0,数组的超出末端指针23,constsize_tarr_size=5;intarrarr_size=1,2,3,4,5;int*p=arr;/ok,ppointtoarr0int*p2=p+arr_size;/p2pointtoonepast/theend,用指针遍历数组元素24,Constsize_tarr_sz=5;Intint_arrarr_sz=0,1,2,3,4;for(int*pbegin=int_arr,*pend=int_arr+arr(sz;pbegin!=pend;+pbegin)cout*pbegin;,指向const对象的指针和const指针25,指向const对象的指针必须具有const特性constdouble*cptr;/cptrpointtoa/doublethatisconstConstdoublepi=3.14;Cptr=/ok,butcantchangedvalthroughcptr,const指针26,const指针是指本身的值不能被修改的指针interrNumb=0;int*constcurErr=,指针和typedef27,typedefstring*pstringconstpstringcstr;问:cstr是什么类型?conststring*cstr;/errorstring*constcstr;/correct!,4.3C风格字符串28,字符串字面值类型其实是constchar类型的数组。而是以空字符null结束的字符数组。charca1=C,+,+;/notnull,notcstylcharca2=C,+,+,0;/explicitnullcharca3=“C+”;/nulladdedautomaticchar*cp1=ca1;char*cp2=ca2;,C风格字符串的标准库函数29,#include标准库函数总是假定每个字符串是以null结束的。,4.3.1创建动态数组30,数组长度固定,在编译时必须知道其长度,只在定义它的块语句内存在。动态分配的数组不必在编译时知道其长度,可以在运行时才确定数组长度。动态分配的数组将一直存在,直到程序显式释放它为止。C语言用一对标准库函数malloc和free在自由存储区中分配存储空间,C+用new和delete实现相同的功能。,动态数组的定义31,动态分配数组时,只需指定类型和长度,不必为数组对象命名。int*pia=newint10;/arrayof10ints,初始化动态分配的数组32,string*psa=newstring10;/arrof10emint*pia=newint10;/arrof10uninitiintsInt*pia2=newint10();,const对象的动态数组33,/error,unitilizedconstarrayConstint*pci_bad=newconstint100;/ok,value-initializedconstarrayconstint*pci_ok=newconstint100();/ok,arrayof100emptystringsConststring*pcs=newconststring100;,允许动态分配空数组34,size_tn=get_size();int*p=newintn;for(int*q=p;q!=p+n;+q)cout*qendl;Chararr0;/error,cantdefine0-lentharChar*cp=newchar0;/ok,butcpcant/bedereferenced,动态空间的释放35,如果不再需要使用动态创建的数组,程序员必须显式地将其占用的存储空间返还给程序的自由存储区。C+为指针提供delete释放指针所指向的数组空间。char*cp=newchar10;Deletecp;,4.4多维数组36,如果数组的元素又是数组,称为多维数组intia34=0,1,2,3,4,5,6,7,8,9,10,11;intia34=0,1,2,3,4,5,6,7,8,9,10,11;Intia34=0,4,8;,指针和多维数组37,由于多维数组其实是数组的数组,由多维数组转换成的指针类型应是指向第一个内层数组的指针。intia34;int(*ip)4=ia;/ippointstoanarrayof/4intsip=/arrayofpointerstoint,作业,4.5,4.7,4.16,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!