《C第六章数组指针与字符串.pptx》由会员分享,可在线阅读,更多相关《C第六章数组指针与字符串.pptx(56页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、面向对象程序设计1数组 数组的声明 格式eg:int a10;10个元素,a0,a1a 数据类型 数组名 常量表达式 1 常量表达式2.整型、浮点型、自定义类型数组名:常量,代表数组元素在内存中的起始地址unsigned int限定数组元素个数9?eg:int a53;有 个元素,a00,a01a?15?43第1页/共56页面向对象程序设计2数组 数组的引用引用数组元素:可以出现在简单变量能出现的任何地方,如,赋值、输入、输出、基本运算格式:数组名下标1 下标2整常数整型变量整型表达式整型数组元素值为整数的函数score2scoreiscore2+iscorenum 2scoremax(i,j
2、)int an;下标取值范围为:0n-1第2页/共56页面向对象程序设计3数组 数组的存储 一维数组元素在内存中顺序、连续存储 数组元素在内存中占据一组连续的存储单元 逻辑上相邻的元素在物理地址上也是相邻的 数组名是数组首元素的内存首地址 为数组a分配的连续的存储单元a0a1a2数组在内存的首地址:a 或?eg:int a3 数组元素为:a0、a1、a2第3页/共56页面向对象程序设计4数组数组的存储 二维数组元素在内存按行存放 相当于一个两行三列的矩阵 先放第一行,再放第二行 每行元素按列下标由小到大顺次存放eg:int a23数组元素为:a00、a01、a02、a10、a11、a12a00
3、a01a02a10a12a11第4页/共56页面向对象程序设计5数组 数组的初始化 初始化:声明数组时给全部或部分数组元素赋初值 基本类型数组:给数组元素赋值 对象数组:调用构造函数1、在定义数组时对数组中的全部元素赋初值eg:int a5=1,2,3,7,6;2、给数组的前几个元素赋初值,其余元素自动初始化为0eg:int b5=1,2,3;=int b5=1,2,3,0,03、定义数组时不指定数组的长度,而用花括号中的初值个数决定数组长度eg:int a=1,2,3,7,6;=int a5=1,2,3,7,6;第5页/共56页面向对象程序设计6数组 实例分析#include using n
4、amespace std;void main()int A5,B5;for()Ai=i*2-1;B5-i-1=Ai;for()coutAi=Ai;cout Bi=Biendl;1、分析程序的运行结果2、填空int i=0;i5;i+int i=0;i5;i+第6页/共56页面向对象程序设计7数组 数组作为函数参数 函数的参数传递方式 值传递:函数调用时,为形参分配单元,并将实参的值复制到形参中;调用结束,形参单元被释放,实参单元仍保留并维持原值特点:形参与实参占用不同的内存单元;“单向”传递 地址传递:函数调用时,将数据的存储地址作为参数传递给形参特点:形参与实参占用同样的存储单元;“双向”传
5、递第7页/共56页面向对象程序设计8数组 数组作为函数参数 数组元素和数组名都可作为函数的参数 数组元素做实参:值传递 数组名做实参:地址传递实参和形参都应该是数组名形参数组和实参数组的首地址重合第8页/共56页面向对象程序设计9数组 实例分析一#include using namespace std;double avrg()double x=0.0;for(int i=0;in;i+)x+=ai;return x/n;void main()int a3=2,7,10,b5=3,12,5,6,8;coutavrg(3,a),avrg(5,b)endl;1、分析程序的运行结果2、填空int n
6、,int a第9页/共56页面向对象程序设计10数组 实例分析二#include using namespace std;void RowSum(int A4,int nrow)for(int i=0;inrow;i+)for(int j=1;j4;j+)Ai0+=Aij;void main()int Table34=1,2,3,4,2,3,4,5,3,4,5,6;for(int i=0;i3;i+)for(int j=0;j4;j+)coutTableij ;coutendl;RowSum();for(i=0;i 3;i+)coutsum of row i:Tablei0endl;1、分析程
7、序的运行结果2、填空Table,3第10页/共56页面向对象程序设计11数组 对象数组 数组元素是同一个类的对象的数组 声明 类名 数组名下标表达式 eg:Date dates7;引用 数组名下标.成员名 eg:dates2.year;初始化 调用构造函数对每个元素初始化1、如声明数组时,给每个元素初值,则调用形参类型匹配的构造函数Date d2=Date(2010,10,11),Date(2010,9,20)2、如果声明数组时,没指定初始值,则调用默认构造函数Date d2=Date(2010,10,11)第11页/共56页面向对象程序设计12数组 实例分析class Datepublic:
8、Date()year=month=day=0;Date(int y,int m,int d)year=y;month=m;day=d;void print()coutyear=year month=month day=dayendl;private:int year,month,day;void main()Date d5=Date(2010,10,1),Date(2010,10,2),Date(2010,10,3);d3=Date(2010,10,4);d4=Date(2010,10,5);for(int i=0;i5;i+)di.print();1、分析程序的运行结果2、修改后分析第12页
9、/共56页面向对象程序设计13指针 内存的地址 内存中存储单元的编号 存储器中的一个字节称为一个存储单元 每个存储单元都有一个唯一的地址 计算机中所有的数据都是存放在内存单元中的 变量的地址 如定义了变量,编译时为该变量分配内存单元 变量所占用内存空间的第一个字节的地址第13页/共56页面向对象程序设计14指针 数据在内存中的存储、读取过程例如:整型变量 i,j,k;在编译时为变量分配内存,内存示意图如图所示 假设变量 i,j,k 被分配的内存地址分别为2000,2002,2004 给变量赋值为 i=3;j=6;k=9;直接访问:直接存取变量所占内存单元的内容内存中用户数据区内存中用户数据区2
10、000200220043010内存地内存地址编号址编号ijk。369如果读取变量 i i的值,直接到为变量i i分配的存储单元(20002000、20012001字节)中取出i i的值(3 3)即可间接访问:首先取出存放该变量的内存单元的地址,然后再从该地址中取出相应内容先将变量 i 的地址存放在另一个变量p中,如果读取变量 i的值,先找到变量p,从p中取出内容(2000,即变量i的起始地址),然后到2000、2001字节中取出i的值(3)2000变量P第14页/共56页面向对象程序设计15指针 指针变量的声明 变量的指针变量的地址 指针变量:存放另一变量地址的变量 指针变量的值是内存地址 声
11、明 数据类型 *指针名*表示这里声明的是指针类型的变量 数据类型可以是任意类型,所指向对象的类型 指针本身的值默认类型是unsigned long integ:int*pointer;第15页/共56页面向对象程序设计16指针 与地址相关的运算符“*”和“&”&地址运算符:例:int var;则&var 表示变量var在内存中的起始地址引用例:int&var;*指针标识符:例:int a=1,*ip;指针运算符:*ip=a;则*ip表示指针所指向变量a的值。第16页/共56页面向对象程序设计17指针 指针的赋值 指针必须先赋值后引用 声明指针的同时进行初始化赋值 数据类型*指针名=初始地址;i
12、nt i;int*p=&i;声明之后,单独使用赋值语句 指针名=地址;int i,*p;p=&i;例:6_5第17页/共56页面向对象程序设计18指针 指针的赋值 可以声明指向常量的指针,不能通过指针改变所指对象的值,但指针本身可改变,可指向另外的对象。可以声明指针类型的常量,这时指针本身的值不能改变。指针的值只能赋给相同类型的指针,但void类型的指针可存储任何类型的对象地址。int a=3,b=5;const int*p=&a;p=&b;*p=8;Xint a=3,b=5;int*const p2=&a;p2=&b;Xvoid*pv;int*pint,i=9;pv=&i;pint=(int
13、*)pv;第18页/共56页面向对象程序设计19指针 指针的运算 算术运算 指针与整数的加减运算 指针相减运算 指针加1和减1运算p+(-)np+(-)nn n:相对于指针所指当前位置的位移量含义:使指针指向当前所指位置前面或后面第n n个数据的位置实际内存地址值:(p)+/-n*sizeof(p)+/-n*sizeof(指针数据类型)如果p p,q q指向同一数组成员,则p-qp-q表示两者之间元素个数指针加1 1:指向后一个数据的位置指针减1 1:指向前一个数据的位置第19页/共56页面向对象程序设计20指针 指针的运算 关系运算,=,=,!=例如p p和q q是相同类型的指针变量pq:p
14、q:若为真,则p p所指目标变量在q q所指目标变量之前 若为假,则p p所指目标变量在q q所指目标变量之后第20页/共56页面向对象程序设计21指针 用指针处理数组元素声明与赋值 例:int a10,*pa;pa=&a0;或 pa=a;通过指针引用数组元素*pa就是a0,*(pa+1)就是a1,.,*(pa+i)就是ai。ai,*(pa+i),*(a+i),pai都是等效的。不能写 a+,因为a是数组首地址是常量。第21页/共56页面向对象程序设计22指针 用指针处理数组元素 例:设有一个int型数组a,有10个元素,用三种方法输出各元素。方法一:使用数组名和下标ai 方法二:使用数组名和
15、指针运算*a+i 方法三:使用指针变量*p见例6_7第22页/共56页面向对象程序设计23指针 指针数组 数组的每个元素都是指针变量 数组元素都必须是同一类型的指针 声明 类型*数组名下标表达式int*p3由p0,p1,p2三个指针组成第23页/共56页面向对象程序设计24指针 指针数组例:用指针数组存放单位矩阵#include using namespace std;void main()int line1=1,0,0;int line2=0,1,0;int line3=0,0,1;int*p_line3;p_line0=line1;p_line1=line2;p_line2=line3;/
16、输出单位矩阵 coutMatrix test:endl;for(int i=0;i3;i+)for(int j=0;j3;j+)coutp_lineij;coutendl;第24页/共56页面向对象程序设计25指针 用指针作为函数参数使实参与形参指针指向共同的内存空间减少函数调用时数据传递的开销例:读入三个浮点数,将整数部分和小数部分分别输出方法一:用指针做函数的形参(例6_10)方法二:用引用做函数的形参(例6_10_1)第25页/共56页面向对象程序设计26指针 用指针作为函数参数方法一:用指针做函数的形参#include using namespace std;/指针做为函数的形参voi
17、d splitfloat()*intpart=int(x);*fracpart=x-*intpart;方法二:用引用做函数的形参float x,int*intpart,float*fracpartfloat x,int&intpart,float&fracpartintpart=int(x);fracpart=x-intpart;第26页/共56页面向对象程序设计27指针 用指针作为函数参数void main()float x,f;int n;coutenter 3 float number:endl;for(int i=0;ix;splitfloat(x,&n,&f);coutinteger
18、=n,fraction=f成员名例如:Point*p,p1;p=&p1;p-getx()相当于(*p).getx();第30页/共56页面向对象程序设计31指针 对象指针对象指针举例int main()Point A(5,10);Point*ptr;ptr=&A;coutGetX()endl;coutA.GetX()*类成员指针名第34页/共56页面向对象程序设计35指针 对象指针 指向类的非静态成员的指针 指向成员函数的指针赋值指针名=&类名:函数成员名引用(对象名.*类成员指针名)(参数表)或:(对象指针名*类成员指针名)(参数表)eg6_1第35页/共56页面向对象程序设计36指针 对象
19、指针访问对象的公有成员函数的不同方式void main()/主函数Point A(4,5);/声明对象APoint*p1=&A;/声明对象指针并初始化 int(Point:*p_GetX)()=Point:GetX;/声明成员函数指针并初始化 coutA.GetX()endl;/使用对象名访问成员函数coutGetX)()endl;/使用对象指针访问成员函数 cout(A.*p_GetX)()endl;/使用成员函数指针访问成员函数 第36页/共56页面向对象程序设计37指针 对象指针 指向类的静态成员的指针对类的静态成员的访问不依赖于对象可以用普通的指针来指向和访问静态成员例6-14(P18
20、4)通过指针访问类的静态数据成员例6-15(P185)通过指针访问类的静态成员函数第37页/共56页面向对象程序设计38动态内存分配 动态内存分配技术在程序运行中按照实际需要申请适量内存 使用结束后可以释放 存储和释放的存储单元称为堆对象 申请-建立 释放-删除第38页/共56页面向对象程序设计39动态内存分配 new运算和delete运算 new:动态分配内存 new 类型T(初值列表);功能:在程序执行期间,申请用于存放T类型对象的内存空间,并依初值列表赋以初值。结果值:成功:T类型的指针,指向新分配的内存的首地址。失败:0(NULL)第39页/共56页面向对象程序设计40动态内存分配 n
21、ew运算和delete运算 delete:删除由new建立的对象,释放指针所指向的内存空间 delete 指针p;功能:释放指针P所指向的内存。P必须是new操作的返回值。注意:用new建立的对象,只能使用delete进行一次删除操作。动态创建对象:6_16第40页/共56页面向对象程序设计41动态内存分配 动态创建对象数组 使用运算符new可以创建数组类型的对象 语法:new 类型名T下标表达式;动态为数组分配内存时不能指定数组元素的初值 如果用new建立的数组,用delete删除时在指针名前加“”delete 指针名动态创建对象数组例6_17第41页/共56页面向对象程序设计42动态内存分
22、配 动态内存分配与释放函数动态存储分配函数 原型:void*malloc(size);参数size:欲分配的字节数 返回值:成功,则返回void型指针。失败,则返回空指针。头文件:和 或和第42页/共56页面向对象程序设计43动态内存分配 动态内存分配与释放函数动态内存释放函数原型:void free(void*memblock);参数memblock:指针,指向需释放的内存。头文件:和 或和第43页/共56页面向对象程序设计44字符串 字符串常量 一对双引号括起来的字符序列,例如:china“按串中字符的排列次序顺序存放 每个字符占一个字节,末尾以0作为结尾标记 存储和处理字符串数据 字符数
23、组 string类第44页/共56页面向对象程序设计45字符串 用字符数组存储和处理字符串 字符数组 数组元素是char型的数组 一维数组存放一个字符串 多维数组存放多个字符串char s14=a,b,c,d;char s25=a,b,c,d,0;char s25=abcd;char s25=abcde;char s2=abcde;char ss34=a,b,c,0,m,n,p,0,x,y,z,0;char ss34=abc,mnp,xyz;char ss4=abc,mnp,xyz;X第45页/共56页面向对象程序设计46字符串 用字符数组存储和处理字符串 用字符数组存放字符串 输入和输出逐个
24、输入、输出整个字符串一次输入或输出 注意输出字符不包括 0输出字符串时,输出项是字符数组名,输出时遇到0结束。输入多个字符串时,以空格分隔;输入单个字符串时其中 不能有空格。char c=china;for(int i=0;i5;i+)coutci;coutstr1str2str3;运行时输入数据:How are you?内存中变量状态如下:str1:H o w 0 str2:a r e 0 str3:y o u?0第47页/共56页面向对象程序设计48字符串 用字符数组存储和处理字符串用字符数组存放字符串若改为:static char str13;cinstr;运行时输入数据:How are
25、 you?内存中变量 str str 内容如下:str:H o w 0 第48页/共56页面向对象程序设计49字符串 用字符数组存储和处理字符串用字符数组存放字符串字符串处理函数strcat(连接)strcpy(复制)strcmp(比较)strlen(求长度)strlwr(转换为小写)strupr(转换为大写)包含头文件cstring第49页/共56页面向对象程序设计50字符串 string类 提供了对字符串进行处理所需要的操作 需包含头文件string 封装了串的属性及访问属性的服务查找、分配、连接、追加 声明:string 字符串变量名;第50页/共56页面向对象程序设计51字符串 str
26、ing类 构造函数原型string();/建立一个长度为0的串string(const string&s);/拷贝初始化构造函数string(const char*s);/用指针s所指向的字符串初始化string类对象string(const string&s,unsigned int pos,unsigned int n);/将对象s中的串从位置pos开始取n个字符,用来初始化string类对象string(const char*s,unsigned int n);/用指针s所指向的字符串中的前n个字符初始化string类对象string(unsigned int n,char c);/将参
27、数c中的字符重复n次,用来初始化string类的对象第51页/共56页面向对象程序设计52字符串 string类 常用成员函数string append(const char*s);/将字符串s添加在本串尾string assign(const char*s);/将s所指字符串赋值给本对象int compare(const string&str)const;比较本串和str串的大小string&insert(unsigned int p0,const char*s);/将s指向的字符串插入本串中p0之前string substr(unsigned int pos,unsigned int n)
28、const;/取本串中从p0开始的n个字符,构成新的string类对象返回unsigned int find(const basic_string&str)const;/查找并返回str在本串中第一次出现的位置unsigned int length()const;/返回串的长度void swap(string&str);/将本串与str字符串进行交换第52页/共56页面向对象程序设计53字符串 string类 string类的操作符操作符操作符示例示例注释注释+s+ts+t将串将串s s和和t t连成一个新串连成一个新串=s=ts=t用用t t更新更新s s+=+=s+=ts+=t等价于等价于
29、s=s+ts=s+t=s=ts=t判断判断s s与与t t是否相等是否相等!=!=s!=ts!=t判断判断s s与与t t是否不等是否不等 stst判断判断s s是否小于是否小于t t=s=ts stst判断判断s s是否大于是否大于t t=s=ts=t判断判断s s是否大于或等于是否大于或等于t tsisi访问串中下标为访问串中下标为i i的字符的字符第53页/共56页面向对象程序设计54字符串 string类#include#include using namespace std;void trueFalse(int x)cout (x?True:False)endl;第54页/共56页面向对象程序设计55字符串void main()string S1=DEF,S2=123;cout S1 is S1 endl;cout S2 is S2 endl;coutlength of S2:S2.length()endl;cout S1=S2 returned;trueFalse(S1=S2);S2+=S1;coutS2=S2+S1:S2endl;coutlength of S2:S2.length()endl;第55页/共56页面向对象程序设计内蒙古工业大学56感谢您的欣赏!第56页/共56页
限制150内