1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,数组 指针与字符串,本章主要内容,数组,指针,动态存储分配,指针与数组,指针与函数,字符串,数组的概念,数组,是具有一定,顺序关系,的若干,相同类型变量的集合体,,组成数组的变量称为该数组的,元素,。,数组属于构造类型。,数 组,题目:输入,10,个整数,求和,如果和大于,1000,则输出,1,,否则输出,0.,一维数组的声明与引用,一维数组的声明,类型说明符 数组名,常量表达式,;,例如:,int,a10;,表示,a,为整型数组,有,10,个元素:,a0.a9,引用,必须,先声明,,后使用。,只能逐个引
2、用数组,元素,,而不能一次引用整个数组例如:,a0=a5+a7-a2*3,数组名的构成方法与一般变量名相同。,数 组,例,6.1,一维数组的声明与引用,#include,using namespace std;,int,main(),int,A10,B10;,int,i;,for(i=0;i10;i+),Ai,=,i*2-1;,B10-i-1,=,Ai;,数 组,for(i=0;i10;i+),cout,Ai,=,Ai;,cout,Bi,=,Bi,endl,;,一维数组的存储顺序,数组元素,在内存中顺次存放,它们的,地址是连续的,。,例如:具有,10,个元素的数组,a,,,在内存中的存放次序如
3、下:,数组,名字,是数组,首元素的内存地址,。,数组名是一个,常量,,不能被赋值。,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a,数 组,一维数组的初始化,可以在编译阶段使数组得到初值:,在声明数组时对数组元素赋以初值。,例如:,static,int,a10=0,1,2,3,4,5,6,7,8,9;,可以只给一部分元素赋初值。,例如:,static,int,a10=0,1,2,3,4;,在对全部数组元素赋初值时,可以不指定数组长度。,例如:,static,int,a=1,2,3,4,5,数 组,#include,using namespace std;,int,main(),
4、int,i;,static,int,f20=1,1;/,初始化第,0,、,1,个数,for(i=2;i20;i+)fi=fi-2+fi-1;/,求第,2,19,个数,for(i=0;i20;i+)/,输出,每行,5,个数,/,if(i%5=0),cout,endl,;,cout.width(12);/,设置输出宽度为,12,cout,fi;,例:用数组来处理求,Fibonacci,数列问题,例:用数组来处理求,Fibonacci,数列问题,运行结果:,11235,813213455,89144233377610,9871597258441816765,一维数组应用举例,循环从键盘读入若干组选择
5、题答案,计算并输出每组答案的正确率,直到输入,ctrl+z,为止。,每组连续输入,5,个答案,每个答案可以是,a.d,。,数 组,#,include,using namespace std;,int main(),char key =a,c,b,a,d;,char c;,int ques=0,numques=5,numcorrect=0;,cout Enter the numques question tests:endl;,while(cin.get(c),if(c!=n),if(c=keyques),numcorrect+;,cout ;,elsecout *;,else,cout Sco
6、re,float(numcorrect)/numques*100%;,ques=0;/reset variables,numcorrect=0;,cout endl;,continue;,ques+;,12,运行结果:,acbba,*Score 60%,acbad,Score 100%,abbda,*Score 40%,bdcba,*Score 0%,13,数组实验,1.,给出年、月、日,计算该日是该年的第几天。,2.,输入,10,个数存放在数组,A,中,然后输入数据,n,,计算并输出,n,在数组,A,中出现的几率。,题目:,输入,10,个整数,找出其中最大值,然后输出。,输入,10,个整数,
7、排序,然后输出。,插入排序,选择排序,交换排序,顺序查找,折半查找,排序(,sorting,),排序,是计算机程序设计中的一种重要操作,它的功能是将一个,数据元素,的任意序列,重新排列成一个按,关键字,有序的序列。,数据元素:,数据的基本单位。在计算机中通常作为一个整体进行考虑。一个数据元素可由若干数据项组成。,关键字:,数据元素中某个数据项的值,用它可以标识(识别)一个数据元素。,在排序过程中需要完成两种基本操作:,比较两个数的大小,调整元素在序列中的位置,内部排序与外部排序,内部排序:,待排序的数据元素存放在计算机内存中进行的排序过程。,外部排序:,待排序的数据元素数量很大,以致内存存中一
8、次不能容纳全部数据,在排序过程中尚需对外存进行访问的排序过程。,内部排序方法,插入排序,选择排序,交换排序,插入排序的基本思想,每一步将一个待排序元素按其关键字值的大小插入到已排序序列的适当位置上,直到待排序元素插入完为止。,初始状态:,5 4 10 20 12 3,插入操作:,1,4,4 5 10 20 12 3,2,10,4 5 10 20 12 3,3,20,4 5 10 20 12 3,4,12,4 5 10 12 20 3,5,3,3 4 5 10 12 20,直接插入排序,在插入排序过程中,由于寻找插入位置的方法不同又可以分为不同的插入排序算法,这里我们只介绍最简单的直接插入排序算
9、法。,void,InsertionSort,(,int,A,int,n),int,i,j;,int,temp;,for(i=1;i 0&temp Aj-1),Aj=Aj-1;,j-;,Aj=temp;,22,选择排序的基本思想,每次从待排序序列中选择一个关键字最小的元素,(当需要按关键字升序排列时),顺序排在已排序序列的最后,直至全部排完。,5 4 10 20,12 3,初始状态:,3 ,4,10 20 12 5,3 4 10 20 12,5,第,i,次选择后,将选出的那个记录与第,i,个记录做,交换,。,3 4 5 20 12,10,.,.,直接选择排序,在选择类排序方法中,从待排序序列中选
10、择元素的方法不同,又分为不同的选择排序方法,其中最简单的是通过顺序比较找出待排序序列中的最小元素,称为直接选择排序。,直接选择排序函数,void Swap(,int,&x,int,&y),int,temp;,temp=x;,x=y;,y=temp;,void,SelectionSort,(,int,A,int,n),int,smallIndex,;,int,i,j;,for(i=0;i n-1;i+),smallIndex,=i;,for(j=i+1;j n;j+),if(Aj 0),lastExchangeIndex,=0;,for(j=0;j i;j+),if(Aj+1 Aj),Swap(
11、Aj,Aj+1);,lastExchangeIndex,=j;,i=,lastExchangeIndex,;,顺序查找,其基本思想,从序列的首元素开始,逐个元素与待查找的关键字进行比较,直到找到相等的。若整个序列中没有与待查找关键字相等的元素,就是查找不成功。,顺序查找函数,int,SeqSearch,(,int,list,int,n,T key),for(,int,i=0;i n;i+),if(listi=key),return i;,return-1;,31,折半查找的基本思想,对于已按关键字排序的序列,经过一次比较,可将序列分割成两部分,然后只在有可能包含待查元素的一部分中继续查找,并根
12、据试探结果继续分割,逐步缩小查找范围,直至找到或找不到为止。,折半查找举例,用折半查找法,在下列序列中查找值为,21,的元素:,L=1,5,13,19,21,37,56,64,75,80,88,92,H=11,M=INT(L+H)/2)=6,5,13,19,21,37,L=1,H=M-1=5,M=INT(L+H)/2)=3,M,21,37,H,L=M+1=4,L,M=INT(L+H)/2)=4,M,折半查找函数模板,int,BinSearch,(,int,list,int,n,int,key),int,mid,low,high;,int,midvalue,;,low=0;,high=n-1;,
13、while(low=high),mid=(low+high)/2;,midvalue,=listmid;,if(key=,midvalue,)return mid;,else if(key,midvalue,)high=mid-1;,else low=mid+1;,return-1;,指针数组,数组的元素是指针型,例:,int,*pa2;,由,pa0,pa1,两个指针组成,利用指针数组存放单位矩阵,#include,using namespace std;,int,main(),int,line1=1,0,0;/,声明数组,矩阵的第一行,int,line2=0,1,0;/,声明数组,矩阵的第二
14、行,int,line3=0,0,1;/,声明数组,矩阵的第三行,int,*p_line3;/,声明整型指针数组,p_line0=line1;/,初始化指针数组元素,p_line1=line2;,p_line2=line3;,/,输出单位矩阵,cout,Matrix test:,endl,;,for(,int,i=0;i3;i+)/,对指针数组元素循环,for(,int,j=0;j3;j+)/,对矩阵每一行循环,cout,p_lineij;,cout,endl,;,输出结果为:,Matrix test:,1,0,0,0,1,0,0,0,1,37,二维数组举例,#include,using nam
15、espace std;,int,main(),int,array223=11,12,13,21,22,23;,for(,int,i=0;i2;i+),cout,*(array2+i),endl,;,for(,int,j=0;j3;j+),cout,*(*(array2+i)+j),;,/,或者,cout,array2ij,;,cout,endl,;,指 针,在某次运行之后,程序的输出结果为:,0X0065FDE0,11,12,13,0X0065FDEC,21,22,23,39,二维数组的声明及引用,数据类型 标识符,常量表达式,1,常量表达式,2;,例,:,int,a53;,表示,a,为整型二
16、维数组,其中第一维有,5,个下标(,04,),第二维有,3,个下标(,02,),数组的元素个数为,15,,可以用于存放,5,行,3,列的整型数据表格。,存储顺序,按行存放,上例中数组,a,的存储顺序为:,二维数组的声明,类型说明符 数组名,常量表达式,常量表达式,例如:,float a34;,a,00,a,01,a,02,a,03,a,10,a,11,a,12,a,13,a,20,a,21,a,22,a,23,a0a,00,a,01,a,02,a,03,a1a,10,a,11,a,12,a,13,a2a,20,a,21,a,22,a,23,a,可以理解为:,引用,例如:,b12=a23/2,下
17、标不要越界,二维数组的声明及引用,41,将所有数据写在一个,内,按顺序赋值,例如:,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;,二维数组的初始化,42,指向二维数组的指针,int,a23=1,2,3,4,5,6;,int,*p;,p=/,等价于,p=a0;,cout,*p=*p,endl,;,/,运行结果:*,p=1,/p=a;/,错误,p,不能用二维
18、数组的数组名给,/,指针变量赋值,cout,a11=*(p+4),endl,;,/p+n1*m1+m2,n1,表示行数,,m1,表示每,/,行元素数,m2,表示列数,int,(*p1)3;/,指向数组的指针,p1=a;,/,正确,用二维数组的数组名给指向数,/,组的指针变量赋值,cout,*(*(p1+1),endl,;,/*p1,*(p1+1),表示第,0,、,1,行首元素,/,的地址,cout,a,endl,;,cout,a0,endl,;/a,和,a0,都表,/,示元素,a00,的地址,cout,p1,endl,;,/p1,表示第,0,行首元素的地址,int,a23,*p,(*p1)3;
19、p=,或,p=a0;,p=p+1;p,指向,a01,p1=a;,p1=p1+1;p1,指向下一行,数组作为函数参数,数组元素作实参,与单个变量一样。,数组名作参数,形、实参数都应是数组名,类型要一样,传送的是数组首地址。对形参数组的改变会直接影响到实参数组,。,数 组,例,6-2,使用数组名作为函数参数,主函数中初始化一个矩阵并将每个元素都输出,然后调用子函数,分别计算每一行的元素之和,将和直接存放在每行的第一个元素中,返回主函数之后输出各行元素的和。,数 组,#,include,using namespace std;,void RowSum(int A4,int nrow),int su
20、m;,for(int i=0;i nrow;i+),sum=0;,for(int j=0;j 4;j+),sum+=Aij;,cout Sum of row i is sum endl;,Ai0=sum;,48,int main(),int Table34=1,2,3,4,2,3,4,5,3,4,5,6;,for(int i=0;i 3;i+),for(int j=0;j 4;j+),cout Tableij ;,cout endl;,RowSum(Table,3);,for(int i=0;i 3;i+),cout Tablei,0,49,运行结果:,1 2 3 4,2 3 4 5,3 4
21、5 6,Sum of row 0 is 10,Sum of row 1 is 14,Sum of row 2 is 18,10 14 18,50,动态申请内存操作符,new,new,类型名,T,(,初值列表),功能:,在程序执行期间,申请用于存放,T,类型对象的内存空间,并依初值列表赋以初值。,结果值:,成功:,T,类型的指针,指向新分配的内存。失败:0(,NULL,),动态存储分配,释放内存操作符,delete,delete,指针,P,功能:,释放指针,P,所指向的内存。,P,必须,是,new,操作的返回值。,动态存储分配,动态创建多维数组,new,类型名,T,下标表达式,1,下标表达式,2
22、如果内存申请成功,,new,运算返回一个指向新分配内存首地址的指针,是一个,T,类型的数组,数组元素的个数为除最左边一维外各维下标表达式的乘积。例如:,char(*,fp,)3;,fp,=new char23;,char(*,fp,)3;,fp,fp+1,fp00,fp01,fp02,fp10,fp11,fp12,54,例,6-18,动态创建多维数组,#include,using namespace std;,int,main(),float(*cp)98;,int,i,j,k;,cp=new float898;,for(i=0;i8;i+),for(j=0;j9;j+),for(k=0
23、k9;k+),*(*(*(cp+i)+j)+k)=i*100+j*10+k;,/,通过指针访问数组元素,动态存储分配,for(i=0;i8;i+),for(j=0;j9;j+),for(k=0;k8;k+),/,将指针,cp,作为数组名使用,,/,通过数组名和下标访问数组元素,cout,cpijk ;,cout,endl,;,cout,endl,;,56,动态存储分配函数,void,*malloc,(size);,参数,size,:,欲分配的字节数,返回值:成功,则返回,void,型指针。失败,则返回空指针。,头文件:,和,动态存储分配,动态内存释放函数,void free(void,*me
24、mblock,);,参数,memblock,:,指针,指向需释放的 内存。,返回值:无,头文件:,和,动态存储分配,用字符数组存储和处理字符串,字符数组的声明和引用,例:,static char str8=112,114,111,103,114,97,109,0;static char str8=p,r,o,g,r,a,m,0;static char str8=program;static char,str,=program;,字符串,字符串常量,例如:,china,没有字符串变量,用字符数组来存放字符串,字符串以,0,为结束标志,字符数组的初始化,字符串,例,6-22,输出一个字符串,#in
25、clude,using namespace std;,int,main(),static char c10=I,a,m,a,b,o,y,;,int,i;,for(i=0;i10;i+),cout,ci;,cout,endl,;,运行结果:,I am a boy,字符串,例,6-23,输出一个钻石图形,#include,using namespace std;,int,main(),static char diamond5=,*,*,*,*,*,*,*,*;,int,i,j,;,for(i=0;i5;i+),for(j=0;j5 j+),cout,diamondij;,cout,endl,;,运
26、行结果:,*,*,*,*,*,字符串,字符串的输入,/,输出,方法,逐个字符输入输出,将整个字符串一次输入或输出,例:,char c=China;,cout,str1str2str3;,运行时输入数据:,How are you?,内存中变量状态如下:,str1:H o w 0,str2:a r e 0,str3:y o u?0,63,若改为:,static char str13;,cin,str,;,运行时输入数据:,How are you?,内存中变量,str,内容如下:,str,:H o w 0,64,用字符数组存储和处理字符串,注意!若有如下声明,:,char a4,*p1,*p2;,错
27、误的,:,a=abc,;,cin,p1;,正确的,:p1=abc;p2=a;,cin,p2;,字符串,整行输入字符串,cin.getline(,字符数组名,St,字符个数,N,结束符);,功能:,一次连续读入多个字符(可以包括空格),直到读满,N,个,或遇到指定的结束符(默认为,n,)。,读入的字符串存放于字符数组,St,中。,读取但不存储结束符,。,cin.get,(,字符数组名,St,字符个数,N,结束符,);,功能:,一次连续读入多个字符(可以包括空格),直到读,满,N,个,或遇到指定的结束符(默认为,n,)。,读入的字符串存放于字符数组,St,中。,既不读取也不存储结束符,。,字符串,
28、整行输入字符串举例,#include,using namespace std;,void main(void),char,city,80;,char,state,80;,int,i;,for(i=0;i 2;i+),cin.getline(city,80,);,cin.getline(state,80,n);,cout,City:city State:state,endl,;,字符串,运行结果,Beijing,China,City:Beijing Country:China,Shanghai,China,City:Shanghai Country:China,字符串处理函数,strcat,(,
29、连接),,strcpy,(,复制),,strcmp,(,比较),,strlen,(,求长度),,strlwr,(,转换为小写),,strupr,(,转换为大写),头文件,字符串,例,6.21 string,类应用举例,#include,#include,using namespace std;,void,trueFalse,(,int,x),cout,(x?True:False),endl,;,字符串,int,main(),string S1,=DEF,S2,=123;,char CP1=ABC;,char CP2=DEF;,cout,S1 is S1,endl,;,cout,S2 is S2
30、endl,;,cout,length of S2:,S2.length,(),endl,;,cout,CP1 is CP1,endl,;,cout,CP2 is CP2,endl,;,cout,S1=CP1 returned;,trueFalse(,S1=,CP1);,cout,CP2=S1 returned;,trueFalse(CP2,=S1,);,S2+=S1,;,cout,S2=S2+S1:,S2,endl,;,cout,length of S2:,S2.length,(),endl,;,71,关于内存地址,内存空间的访问方式,通过变量名访问,通过地址访问,地址运算符:,&,例:,i
31、nt,var,;,则,&var,表示变量,var,在内存中的起始地址,数据和内存,数据以二进制的形式存放在内存中,作一个形象的比喻,内存就像一个大蜂巢,它由数以亿计的蜂室组成,每个蜂室存放一个,0,或者一个,1,,如图所示。,比特(,bit,),那么内存到底由什么组成呢?原来内存是由千千万万个具有两个状态的电子开关组成的。电子开关打开时代表,1,,闭合时代表,0,。因此每个电子开关可以代表一位二进制数,计算机内存就是一个庞大的电子开关的集合体。这些电子开关称为比特(,bit,),是最小的存储单位。比特也叫做位。,如下图所示的一组电子开关表示二进制,10110010,,即十进制的,178,。因此
32、内存中的数据可以看作由,0,和,1,组成的数据流。,字节(,Byte,),要方便地存取信息,必须把这些电子开关有机地组织起来,一般用,8,个二进制位组成一个字节,如下图所示。,计算机内存就是由很多排列整齐的字节组成的,为了管理方便,每个字节都有相应的位置编号,这个编号就是这个字节的,“,地址,”,,通过地址可以找到内存中任何一个字节的内容,如下图所示,声明,例:,static,int,i;,static,int,*i_pointer=,指向整型变量的指针,指针变量的概念,概念,指针:内存地址,用于 间接访问内存单元,指针变量:用于存放地址的变量,2000,3,i_pointer,*i_poin
33、ter,i,2000,内存用户数据区,变量,i,变量,j,变量,i_pointer,3,6,2000,2000,2004,3010,引用,例,1,:,i=3;,例,2,:*,i_pointer=3;,指 针,指针变量的初始化,语法形式,存储类型 数据类型 *指针名初始地址;,例:,int,*pa=,注意事项,用变量地址作为初值时,该变量必须在指针初始化之前已说明过,且变量类型应与指针类型一致。,可以用一个已赋初值的指针去初始化另一 个指针变量。,不要用一个内部,auto,变量去初始化,static,指针。,指 针,指针变量的赋值运算,指针名,=,地址,“,地址,”,中存放的数据类型与指针类型必
34、须相符。,向指针变量赋的值必须是地址常量或变量,不能是普通整数。但可以赋值为整数,0,,表示空指针。,指针的类型是它所指向变量的类型,而不是指针本身数据值的类型,任何一个指针本身的数据值都是,unsigned long,int,型。,允许声明指向,void,类型的指针。该指针可以被赋予任何类型对象的地址。,例:,void*general;,指 针,例,6-5,指针的声明、赋值与使用,#include,using namespace std;,int,main(),int,*i_pointer;/,声明,int,型指针,i_pointer,int,i;/,声明,int,型数,i,i_pointe
35、r=/,取,i,的地址赋给,i_pointer,i=10;/,int,型数赋初值,cout,Output,int,i=i,endl,;/,输出,int,型数的值,cout,Output,int,pointer i=*i_pointer,endl,;,/,输出,int,型指针所指地址的内容,指 针,程序运行的结果是:,Output,int,i=10,Output,int,pointer i=10,83,例,6-6 void,类型指针的使用,void,vobject,;/,错,不能声明,void,类型的变量,void,*pv,;/,对,可以声明,void,类型的指针,int,*pint;,int,
36、i;,int,main(),pv,=/void,类型指针指向整型变量,/void,指针赋值给,int,指针需要类型强制转换,:,pint=(,int,*),pv,;,指 针,指向常量的指针,不能通过指针来改变所指对象的值,但指针本身可以改变,可以指向另外的对象。,例,1,char*name1=John;/name1,是一般指针,*,name1=A;/,编译正确,运行出错,例,2,const char*,name1,=John;/,指向常量的指针,char s,=abc,;,name1,=s;/,正确,,name1,本身的值可以改变,*,name1,=1;/,编译时指出错误,指 针,指针类型的常
37、量,若声明指针常量,则指针本身的值不能被改变。例:,char *const name2=John;,name2=abc;/,错误,指针常量值不能改变,指针变量的算术运算,指针与整数的加减运算,指针,p,加上或减去,n,,,其意义是指针当前指向位置的前方或后方第,n,个数据的地址。,这种运算的结果值取决于指针指向的数据类型。,指针加一,减一运算,指向下一个或前一个数据。,例如:,y=*px+,相当于,y=*(,px+,)(*,和,+,优先级相同,自右向左运算,),指 针,pa,pa-2,pa-1,pa+1,pa+2,pa+3,*,(pa-2),*pa,*,(pa+1),*,(pa+2),*,(p
38、a+3),*,(pa-1),short*pa,88,pb-1,pb,pb+1,pb+2,*,(pb-1),*,pb,*,(pb+1),*,(pb+2),long,*pb,89,关系运算,指向相同类型数据的指针之间可以进行各种关系运算。,指向不同数据类型的指针,以及指针与一般整数变量之间的关系运算是无意义的。,指针可以和零之间进行等于或不等于的关系运算。例如:,p=0,或,p!=0,赋值运算,向指针变量赋的值必须是地址常量或变量,不能是普通整数。但可以赋值为整数,0,,表示空指针。,指针变量的关系运算,指 针,指向数组元素的指针,声明与赋值,例:,int,a10,*pa;,pa=,或,pa=a;
39、通过指针引用数组元素,经过上述声明及赋值后:,*,pa,就是,a0,,*,(pa+1),就是,a1,,,.,,*,(pa+i),就是,ai.,ai,*(pa+i),*(a+i),pai,都是等效的。,不能写,a+,,,因为,a,是数组首地址是常量。,指 针,例6-7,设有一个,int,型数组,a,,有,10,个元素。用三种方法输出各元素:,使用数组名和下标,使用数组名和指针运算,使用指针变量,指 针,int,main(),int,a10;,int,i;,for(i=0;iai;,cout,endl,;,for(i=0;i10;i+),cout,ai,;,使用数组名和下标,93,int,mai
40、n(),int,a10;,int,i;,for(i=0;iai;,cout,endl,;,for(i=0;i10;i+),cout,*(a+i);,使用数组名指针运算,使用指针变量,int,main(),int,a10;,int,*p,i,;,for(i=0;iai;,cout,endl,;,for(p=a;p(a+10);p+),cout,*p,;,以指针作为函数参数,以地址方式传递数据,可以用来返回函数处理结果。,实参是数组名时形参可以是指针。,指针与函数,例6.10,题目:读入三个浮点数,将整数部分和小数部分分别输出,#,include,using namespace std;,void
41、 splitfloat(float x,int,*intpart,float,*fracpart,),/,形参,intpart、fracpart,是指针,*intpart,=int(x);/,取,x,的整数部分,*fracpart,=x-*intpart;/,取,x,的小数部分,指针与函数,int main(),int i,n;,float x,f;,cout Enter three(3)floating point numbers endl;,for(i=0;i x;,splitfloat(x,&n,&f,);/,变量地址做实参,cout Integer Part is ,n,Fractio
42、n Part is ,f,endl;,98,运行结果:,Enter three(3)floating point numbers,4.7,Integer Part is 4 Fraction Part is 0.7,8.913,Integer Part is 8 Fraction Part is 0.913,-4.7518,Integer Part is-4 Fraction Part is-0.7518,99,例,:,输出数组元素的内容和地址,#,include,#include,using namespace std;,void Array_Ptr(long,*P,int n),int i
43、cout In func,address of array is unsigned long(,P,)endl;,cout Accessing array in the function using pointers endl;,for(i=0;i n;i+),cout Address for index i is unsigned long,(P+i);,cout Value is ,*(P+i),endl;,指针与函数,int main(),long list5=50,60,70,80,90;,cout In main,address of array is,unsigned long
44、list,)endl;,cout endl;,Array_Ptr(list,5);,运行结果:,In main,address of array is 6684132,In,func,address of array is 6684132,Accessing array in the function using pointers,Address for index 0 is 6684132 Value is 50,Address for index 1 is 6684136 Value is 60,Address for index 2 is 6684140 Value is 70,Ad
45、dress for index 3 is 6684144 Value is 80,Address for index 4 is 6684148 Value is 90,102,指向常量的指针做形参,#include,using namespace std;,const,int,N=6;,void print(,const,int,*p,int,n);,int,main(),int,arrayN;,for(,int,i=0;iarrayi;,print(,array,N);,指 针,void print(,const,int,*p,int,n),cout,*p;,for(,int,i=1;in;
46、i+),cout,.*(p+i);,cout,endl,;,104,指针型函数,当函数的返回值是地址时,该函数就是指针形函数。,声明形式,存储类型 数据类型 *函数名,(),指针与函数,声明形式,存储类型 数据类型,(*,函数指针名,)();,含义:,数据指针指向数据存储区,而函数指针指向的是程序代码存储区。,指向函数的指针,指针与函数,例,6-11,函数指针,#include,using namespace std;,void print_stuff(float data_to_ignore);,void print_message(float list_this_data);,void p
47、rint_float(float data_to_print);,void(*,function_pointer,)(float);,int,main(),float pi=(float)3.14159;,float two_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);,fun
48、ction_pointer,=,print_float,;,function_pointer,(pi);,print_float(pi);,108,void print_stuff(float data_to_ignore),cout,This is the print stuff function.n;,void print_message(float list_this_data),cout,The data to be listed is,list_this_data,endl,;,void print_float(float data_to_print),cout,The data t
49、o be printed is,data_to_print,endl,;,109,运行结果:,This is the print stuff function.,This is the print stuff function.,The data to be listed is 6.283180,The data to be listed is 13.000000,The data to be printed is 3.141590,The data to be printed is 3.141590,110,动态申请内存操作符,new,new,类型名,T,(,初值列表),功能:,在程序执行期
50、间,申请用于存放,T,类型对象的内存空间,并依初值列表赋以初值。,结果值:,成功:,T,类型的指针,指向新分配的内存。失败:0(,NULL,),动态存储分配,释放内存操作符,delete,delete,指针,P,功能:,释放指针,P,所指向的内存。,P,必须,是,new,操作的返回值。,动态存储分配,动态创建多维数组,new,类型名,T,下标表达式,1,下标表达式,2,;,如果内存申请成功,,new,运算返回一个指向新分配内存首地址的指针,是一个,T,类型的数组,数组元素的个数为除最左边一维外各维下标表达式的乘积。例如:,char(*,fp,)3;,fp,=new char23;,char(*






