您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > C++语言程序设计课件 第06章 数组、指针与字符串
第六章数组、指针与字符串C++语言程序设计2本章主要内容数组指针动态存储分配深拷贝与浅拷贝字符串3数组的概念数组是具有一定顺序关系的若干相同类型变量的集合体,组成数组的变量称为该数组的元素。数组属于构造类型。数组4数组的几点说明数组的定义形式同C语言中的数组。数组名是常量,表示数组元素的首地址。数组下标从零开始。下标必须是整形表达式。数组元素可以在定义时直接给出初始值列表。数组元素作函数参数同简单变量作函数参数。数组名作函数参数传递的是地址值。二维数组在内存中按行存放。数组5对象数组声明:类名数组名[元素个数];访问方法:数组名[下标].成员名数组6对象数组初始化数组中每一个元素对象被创建时,系统都会调用类构造函数初始化该对象。通过初始化列表赋值。PointA[2]={Point(1,2),Point(3,4)};如果没有为数组元素指定显式初始值,数组元素便使用默认值初始化(调用默认构造函数或带默认形参值的构造函数)。PointA[2]={Point(1,2)};数组7数组元素所属类的构造函数各元素对象的初值要求为相同的值时,可以声明具有默认形参值的构造函数。各元素对象的初值要求为不同的值时,需要声明带形参的构造函数。当数组中每一个对象被删除时,系统都要调用一次析构函数。数组8数组#includeiostreamusingnamespacestd;classPoint{public:Point();~Point();};Point::Point(){coutDefaultConstructorcalled.endl;}Point::~Point(){coutDestructorcalled.endl;}voidmain(){PointA[2];}P163例6-39声明例:inti;int*i_pointer;概念指针:内存地址,用于间接访问内存单元指针变量:用于存放地址的变量20003i_pointer*i_pointeri2000引用i_pointer=&i;i=3;*i_pointer=3;指针指针变量的概念10语法形式存储类型数据类型*指针名=初始地址;例:inta,*pa=&a;注意事项用变量地址作为初值时,该变量必须在指针初始化之前已说明过,且变量类型应与指针类型一致。可以用一个已赋初值的指针去初始化另一个指针变量。不要用一个内部auto变量去初始化static指针。指针指针变量的初始化11指针名=地址向指针变量赋的值必须是地址常量或变量,不能是普通整数。但可以赋值为整数0,表示空指针。指针的类型是它所指向变量的类型,而不是指针本身数据值的类型,任何一个指针本身的数据值都是unsignedlongint型。允许声明指向void类型的指针。该指针可以被赋予任何类型对象的地址。但是不能通过void类型的指针间接访问所指向的变量,必须经过强制类型转换。指针指针变量的赋值12例6-6void类型指针的使用#includeiostreamusingnamespacestd;//voidvobject;//错,不能声明void类型的变量void*pv;//对,可以声明void类型的指针int*pint;inti;voidmain(){couti=iendl;pv=&i;//void类型指针指向整型变量//cout*pv=*pvendl;//错,不能访问pint=(int*)pv;cout*pint=*pintendl;}指针cout*pv=*(int*)pvendl;13指针变量的算术运算指针与整数的加减运算–指针p加上或减去n,其意义是指针当前指向位置的前方或后方第n个数据的地址。–这种运算的结果值取决于指针指向的数据类型。指针自增,自减运算–指向下一个或前一个数据。–例如:y=*px++相当于y=*(px++)(*和++优先级相同,自右向左运算)指针papa-2pa-1pa+1pa+2pa+3*(pa-2)*pa*(pa+1)*(pa+2)*(pa+3)*(pa-1)short*pa14pb-1pbpb+1pb+2*(pb-1)*pb*(pb+1)*(pb+2)long*pb1516关系运算–指向相同类型数据的指针之间可以进行==与!=的关系运算。–指向不同数据类型的指针,以及指针与一般整数变量之间的关系运算是无意义的。–指针可以和零之间进行等于或不等于的关系运算。例如:p==0或p!=0指针变量的关系运算指针17指向数组元素的指针声明与赋值例:inta[10],*pa;pa=&a[0];或pa=a;通过指针引用数组元素经过上述声明及赋值后:–*pa就是a[0],*(pa+i)就是a[i].–a[i],*(pa+i),*(a+i),pa[i]都是等效的。–不能写a++,因为a是数组首地址(是常量)。指针18指针数组数组的元素是指针类型例:Point*pa[2];由pa[0],pa[1]两个指针组成指针19例6-8利用指针数组存放单位矩阵#includeiostreamusingnamespacestd;voidmain(){intline1[]={1,0,0};//声明数组,矩阵的第一行intline2[]={0,1,0};//声明数组,矩阵的第二行intline3[]={0,0,1};//声明数组,矩阵的第三行int*p_line[3];//声明整型指针数组p_line[0]=line1;//初始化指针数组元素p_line[1]=line2;p_line[2]=line3;指针//输出单位矩阵coutMatrixtest:endl;for(inti=0;i3;i++){for(intj=0;j3;j++)cout;coutendl;}}输出结果为:Matrixtest:10001000120指针也可以写成:p_line[i][j]或*(*(p_line+i)+j)*(p_line[i]+j)21例6-9二维数组举例#includeiostreamusingnamespacestd;voidmain(){inta[2][3]={{11,12,13},{21,22,23}};int(*p1)[3]=a;for(inti=0;i2;i++){for(intj=0;j3;j++)cout*(*(p1+i)+j);coutendl;}}指针可以写成:*(p1[i]+j)或p1[i][j]22例6-9二维数组举例#includeiostreamusingnamespacestd;voidmain(){inta[2][3]={{11,12,13},{21,22,23}};int*p1=a;for(inti=0;i2;i++){for(intj=0;j3;j++)cout*p1++;coutendl;}}指针在C++中这种赋值是错误的。23以指针作为函数参数以地址方式传递数据,可以用来返回函数处理结果。实参是数组名时形参可以是指针。指针与函数24例6-10题目:读入三个浮点数,将整数部分和小数部分分别输出#includeiostreamusingnamespacestd;voidsplitfloat(floatx,int*intpart,float*fracpart){*intpart=int(x);//取x的整数部分*fracpart=x-*intpart;//取x的小数部分}指针与函数voidmain(){inti,n;floatx,f;coutEnterthree(3)floatingpointnumbersendl;for(i=0;i3;i++){cinx;splitfloat(x,&n,&f);coutIntegerPartisnFractionPartisfendl;}}25指针与函数运行结果:Enterthree(3)floatingpointnumbers4.7IntegerPartis4FractionPartis0.78.913IntegerPartis8FractionPartis0.913-4.7518IntegerPartis-4FractionPartis-0.751826指针与函数27例:输出数组元素的内容和地址#includeiostream#includeiomanipusingnamespacestd;voidArray_Ptr(long*P,intn){inti;coutInfunc,addressofarrayisunsignedlong(P)endl;coutAccessingarrayusingpointersendl;for(i=0;in;i++){coutAddressforindexiisunsignedlong(P+i);coutValueis*(P+i)endl;}}指针与函数voidmain(){longlist[5]={50,60,70,80,90};coutInmain,addressofarrayisunsignedlong(list)endl;coutendl;Array_Ptr(list,5);}28运行结果:Inmain,addressofarrayis6684132Infunc,addressofarrayis6684132AccessingarrayusingpointersAddressforindex0is6684132Valueis50Addressforindex1is6684136Valueis60Addressforindex2is6684140Valueis70Addressforindex3is6684144Valueis80Addressforindex4is6684148Valueis902930指针型函数当函数的返回值是地址时,该函数就是指针型函数。定义形式:返回值类型*函数名(参数表){函数体}指针与函数31指针型函数#includeiostreamusingnamespacestd;char*ch(chars[]){inti;for(i=0;s[i]!='\0';i++)if(s[i]=='A')break;returns+i;}voidmain(){char*s=ThbikAjiklom;coutch(s)endl;}指针与函数32声明形式数据类型(*函数指针名)();含义:–数据指针指向数据存储区,而函数指针指向的是程序代码存储区。指向函数的指针指针与函数33例6-11函数指针#includeiostreamusingnamespacestd;voidprint_stuff(floatdata_to_ignore);voidprint_message(floatlist_this_data);voidprint_float(floatdata_to_print);void(*function_pointer)(float);voidmain(){floatpi=(float)3.14159;floattwo_pi=(float)2.0*pi;指针与函数print_stuff(pi);function_pointer=print_stuff;function_pointer(pi);function_pointer=print_message;function_pointer(two_pi);function_pointer(13.0);function_pointer=print_float;function_pointer(pi);print_float(pi);}34指针与函数voidprint_stuff(floatdata_to_ignore){coutThisisth
本文标题:C++语言程序设计课件 第06章 数组、指针与字符串
链接地址:https://www.777doc.com/doc-3263009 .html