资源描述
,*,*,*,*,*,*,*,*,*,*,*,*,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,西南交通大学 戴克俭 c+第五章,第五章 指针的应用,教学内容:,1,掌握地址和指针的概念,2,掌握指针类型变量的定义、赋值以及引用的方法,3,掌握将一个变量或数组的地址赋给指针类型的变量,4,掌握指针操作相关的运算符;,5,掌握通过指针类型的变量去访问单一变量;,6,掌握通过指针类型的变量去操作一维数组;,7,理解通过指针类型的变量去操作二维数组;,8,理解动态存储分配的概念及应用。,2,5.1,指针的概述,例,5.1.1,阅读如下程序:,源程序清单:,#include,using namespace std;,void main(),int a;,int*p;,a=10;,p=,3,5.1,指针的概述,couta,的值表示方法,1,:,aendl;,couta,的值表示方法,2,:,*pendl;,couta,的地址表示方法,1,:,couta,的地址表示方法,2,:,pendl;,编程技巧:,在源程序清单中,我们可以看到在操作变量,a,时,用了不同的两种方法,一种就是用我们很习惯的变量名的方式操作,另一种就是本章要学习的新概念指针的方式操作。,4,5.1,指针的概述,1,指针是,C+,从,C,中继承过来的重要的概念,它提供了一种较为直观的地址操作的手段。正确地使用指针,可以方便、灵活而有效地组织和表示复杂的数据结构。,2,利用指针可以进行动态内存分配和管理,可以更灵活地使用内存空间。,3,为了理解指针,要先理解关于内存地址的概念。计算机的内存储器就像一个巨大的一维数组,每个数组元素就是一个存储单元。就像数组中的每个元素都有一个下标一样,每个内存单元都有一个编号,这个编号就称为内存单元的地址。在微型计算机,地址编码的基本单位是字节,每个字节是一个基本内存单元。,5,5.1,指针的概述,4,在运行一个程序时,程序本身及其所用到的数据都要放在内存储器中。程序、函数、变量、常数、数组和对象等,在内存储器中都要占有一席之地。存放在内存储器中的程序和数据都有一个地址,用它们占用的那片存储单元中的第一个存储单元的地址表示。,5,在,C+,中,为某个变量、函数常数、数组和对象等分配内存储器的工作由编译程序完成。计算机通过这种地址编号的方式来管理内存数据读写的准确定位。程序中声明的变量是要占据一定的内存空间的,不同的数据类型占用的字节数是不一样的,例如:,char,型占,1,个字节,,short,型占,2,个字节,,int,型和,long,型都占,4,个字节。如图,5-1,所示,表明了每一个内存单元都有自己的地址,在地址所标志的内存单元中可用来存放数据,一般称为内存单元的内容。,6,5.1,指针的概述,内存单元,内存单元,内存单元,2000,2001,2002,3000,地址编号,内存储器,3,6,300,4,内存单元,的地址,内存单元,的内容,int i=3;,int j=6;,7,6,在,C+,程序中是如何从内存单元中存取数据的呢,(1),是通过变量名,称为直接访问方式,直接对变量的存储单元进行存取访问。在变量获得内存空间的同时,变量名也就成为了相应内存空间的名称,在变量的整个生存期内都可以用这个名字访问该内存空间,表现在程序语句中就是通过变量名存取变量内容。,例如:,例,5.1.1,中,用语句:,couta,的值表示方法,1,:,aendl;,来输出变量,a,的值。,5.1,指针的概述,8,(2),是通过地址,称为间接访问方式,先找到存放变量的地址的变量,得到变量的地址,再根据变量的地址找到变量的存储单元,对它进行存取访问。例如:,例,5.1.1,中,用语句:,couta,的值表示方法,2,:,*pendl;,来输出变量,a,的值。,(3),有时使用变量名不够方便或者根本没有变量可用,这时就需要直接用地址来访问内存单元。例如,在不同的函数之间传送大量数据时,如果不是传递变量值,而是只传递变量的地址,就会减小开销,提高效率。如果是动态分配的内存单元,则根本就没有名称,这时只能通过地址访问。,5.1,指针的概述,9,5.1,指针的概述,1,如何通过地址来操作呢?,在,C+,中专门用一种数据类型,称为“指针”数据类型来表示“地址”,指针实际上是某个内存单元的首地址。一个变量在内存空间中占用的地址就称为该变量的“指针”。,2,程序中定义的任何变量、数组或函数等,在编译时都会在内存中分配一个确定的地址单元,即都有地址。,C+,规定:,10,(1),变量的地址可以用,&,表示。例如,&i,表示变量,i,的地址。,(2),数组的地址,即数组第一个元素的地址,可以直接用数组名表示。例如,a,或,&a0,。,(3),函数的地址用函数名表示。(关于函数的概念将在下一章学习),5.1,指针的概述,11,1,如何使用指针呢?,(1),由于指针是一种数据类型,是包含另一个变量地址的变量,指针也是一个变量,应遵循先定义,后使用。,(2),定义指针类型是由该指针指向的变量类型决定。,定义指针变量的一般格式如下:,定义语句中的“*”表示该变量为指针变量。,5.2,指针变量的定义、赋值及使用,存储类型 数据类型 *指针变量,12,数据类型标识符规定了指针变量指向的数据类型,例如:,例,5.1.1,中,定义语句:,int *p;,“*”,表示该变量,p,为指针变量;且指针变量,p,只能操作整型数据。,5.2,指针变量的定义、赋值及使用,13,2,指针变量的初始化的常用形式:,与变量定义一样,定义好指针变量后也可以对它进行初始化,指针变量可以初始化为,0,、,NULL,或一个地址。数值为,0,或者,NULL,的指针不指任何内容。数值,0,是可以直接赋给指针变量的唯一整数值。,(1),指针变量的初始化常用的第一种形式:,在定义指针变量的同时进行初始化赋值,一般格式如下:,数据类型 *指针名初始地址;,5.2,指针变量的定义、赋值及使用,14,例如:,int a=3;,int*pa=,(2),指针变量的初始化常用的第二种形式:,定义指针变量后,用赋值语句将其初始化。,指针变量名,=,地址;可以是变量的地址、数组名、函数名等。,例如:先定义:,int*p;,再用赋值语句:,p=,5.2,指针变量的定义、赋值及使用,15,(3),使用时注意事项:,指针的类型是它所指向变量的类型。,已赋初值的指针可以初始化另一个指针变量。,例如:,q=p;,由于,p,已经有值,可以来初始化,q,。,用变量地址作为初值时,该变量的定义必须在指针初始化之前定义。,例如:,例,5.3.1,中,,int a=3;int*pa=,int x;int*p;p=,变量的定义一定要在指针定义之前。,5.2,指针变量的定义、赋值及使用,16,不能把常量或表达式的地址赋给指针变量。例如:,P=&67,;,P=&(i+5),是非法的。,不能将一个非,0,整数直接赋给指针变量,但可以赋整数值,0,,表示该指针为空指针。,例如:,int*p;p=0;p,为空指针,不指向任何地址。,允许声明指向,void,类型的指针,该指针可以被赋予任何类型对象的地址。,例如:,void*general;,int*point;int i;,general=,5.2,指针变量的定义、赋值及使用,17,3,使用时要注意指针与指针变量的区别:,指针是内存单元的地址,简称地址。,指针变量是用于存储变量地址的变量。,5.2,指针变量的定义、赋值及使用,18,1,为了使用指针变量,要掌握两个运算符:,(1),指针运算符*,也称为“间接访问”运算符,是一个一元运算符,表示指针变量所指向的变量的值。,(2),取地址运算符,&,,是一个一元运算符,用来得到一个对象的地址,例:,&x,,取变量,x,的地址。取地址运算符的操作数必须是变量名。,2,使用指针变量与使用一般变量一样,一定要先定义后使用,使用前,指针变量一定要有明确的指向,例如,,int*p,;,,p=&x,;明确指向变量,x,的地址。,5.2,指针变量的定义、赋值及使用,19,5.3,通过指针变量访问单一变量,例,5.5.1,阅读如下程序:,源程序清单:,#include,using namespace std;,void main(),int x,*p;,x=3;,p=,*p=*p+10;,cout*pendl;,20,5.3,通过指针变量访问单一变量,编程技巧:,1,程序中定义指针变量,p,它的数据类型与它要操作的变量的数据类型一致,,例,5.5.1,中同为,int,。,2,定义好指针变量,p,后,用赋值语句,p=&x,;将它要操作的变量的地址赋给了指针变量,p,。,3,用间接访问*,p,,替代变量名来操作变量,,例,5.5.1,中*,p=*p+10,;在原来的值,3,基础上加上,10,,与语句,x=x+10,;等价。,4,用*,p,输出值,即输出值为,13,。,21,5,注意事项:,(1)*,出现在定义语句中和执行语句中其含义是不同的,例如:,例,5.5.1,中,,int x,*p;,在该语句中,*,p,是一个,int,型指针,*在定义语句中,表示定义的是指针变量,cout*p;,在该语句中,*,p,是输出指针,p,的内容,*在执行语句表示指针所指对象的内容。,(2)p=,将变量,x,的地址赋给指针变量,p,,一定要先定义,x,,然后才能将变量,x,的地址赋给指针变量,p,,,p,有明确的指向后才能操作。,5.3,通过指针变量访问单一变量,22,例,5.5.2,输入,a,和,b,两个整数,运用指针技术按先大后小的顺序输出,a,和,b,。,思路分析:输入两个整数,判断谁大谁小,若,a,大输出,a,,,b,;若,a,小输出,b,,,a,。,算法描述:,5.3,通过指针变量访问单一变量,输出*,p1,、*,p2,的值,输出*,p2,、*,p1,的值,*,p1*p2,Y N,用指针操作方式从键盘获取输入两个整数的值,定义两个整型变量,及操作它们的两个整型指针,并把两个整型变量的地址分别赋给两个整型指针,23,源程序清单:,#include,#include,using namespace std;,void main(void),int a,b;,int*p1=,int*p2=,coutinput a and b:*p1*p2;,5.3,通过指针变量访问单一变量,24,if(*p1*p2),cout,按先大后小的顺序输出的,a,和,b,为,:*p2setw(4)*p1endl;,else,cout,按先大后小的顺序输出的,a,和,b,为,:*p1setw(4)*p2endl;,编程技巧:,1,利用间接访问方式来操作。,5.3,通过指针变量访问单一变量,25,5.4,通过指针变量操作一维数组,在,C+,中,有了指针和地址的概念,我们在操作数组时,就可以用如下的四种方法来操作数组。,使用数组名和下标,使用数组名和指针运算,使用指针变量,使用下标表示法引用指针指向的数组元素,例,5.6.1,设有一个,int,型数组,a,,有,10,个元素,请用上述的四种方法去访问数组的各个元素。,26,源程序清单:,#include,using namespace std;,void main(),int a10;,int i,*p;,for(i=0;iai;/,数组名和下标来访问数组,5.4,通过指针变量操作一维数组,27,for(i=0;i10;i+),cout*(a+i);/,数组名和指针运算来访问数组,for(p=a;p-a10;p+),cout*p;/,指针变量的移动来访问数组,p=a;,for(i=0;i10;i+),coutpi;/,下标表示法,5.4,通过指针变量操作一维数组,28,编程技巧:,1,例中第一种方法操作数组时,使用数组名和下标来访问数组,是第四章中我们已经学习和掌握的方法。,2,例中第二种方法操作数组时,使用数组名和指针运算来访问数组,利用了数组名,a,是数组首地址,是一个地址常量,是数组第一个元素的地址,但数组名所代表的首地址只是一个指针常量,是固定的指针,我们不能对数组名赋予一个新的地址值,也不能使这指针常量“移动”,指向数组的其它元素,要指向其它数组元素时,通过首地址加上一个值,使之指向其它的数组元素。例如:,例,5.6.1,中就通过*,(a+i),来指向数组中的第,i,个元素。,5.4 通过指针变量操作一维数组,29,3,例中第三种方法操作数组时,使用指针变量来访问数组,是利用指针变量可以赋新的地址值和使指针变量“移动”而指向数组的其它元素。,4,例中第四种方法操作数组时,使用下标表示法引用指针指向的数组元素,注意操作时,指针要指向数组的首地址。,5.4,通过指针变量操作一维数组,30,1,要使用指针变量来访问数组,关键是如何“移动”指针变量,使指针变量指向具体要操作地数组元素的地址,就需要掌握指针变量的算术运算。,指针与整数的加减运算,指针,p,加上或减去,n,,其意义是指针当前指向位置的前方或后方第,n,个数据的地址。,指针加一,减一运算,指向下一个或前一个数据。,例如:,y=*px+,相当于,y=*(px+)*,和+优先级相同,自右向左结合,5.4,通过指针变量操作一维数组,31,如:,int a5=1,2,3,4,5;,int*p;,p=a;p+;p+=3;p-;,指针变量值每自增一次,指向后一个数组元,素的内存单元,指针变量值每自减一次,指向前一个数组元,素的内存单元,6.8 指针的算术运算,pa-2,pa-1,pa+1,pa+2,pa+3,*(,pa-2),*,pa,*(,pa+1),*(,pa+2),*(,pa+3),*(,pa-1),short*pa,pa,32,两指针相减:,两指针相减的结果是一个整数,等于两指针指向的内存单元之间的内存单元的个数减,1,。,例如:,int a10,*p,*q,k;,p=a;,q=a+10;,k=q-p;/k,的值等于,9,5.4,通过指针变量操作一维数组,33,例,5.6.3,阅读如下程序:,源程序清单:,#include,using namespace std;,void main(),char a10=abcdefghi;,char*p1,*p2;,p1=a;,p1+=2;,p2=a+4;/,指针变量,p2,,直接由数组名加上,4,,指向数组,的第五个数组元素的内存单元,5.4,通过指针变量操作一维数组,34,if(p1p2),cout“p1,所指向的数组元素在,p2,所指向的数组元素前,面!,endl;,else,cout“p1,所指向的数组元素在,p2,所指向的数组元素后,面!,endl;,p1+;p2-;,if(p1=p2),cout“p1,和,p2,同时指向数组中的同一个元素且元素值,为:,*p1endl;,else,coutp1,和,p2,没有指向数组中的同一个元素,!endl;,5.4,通过指针变量操作一维数组,35,编程技巧:,1,在操作数组时,有时可能会用到两个指针变量指向同一个数组,例如:在,例,5.6.3,中,用,p1,和,p2,两个指针变量指向同一个数组,此时两个指针变量之间的可以进行关系运算,其关系运算的结果表明了这两个指针变量所指向的数组元素的先后关系。,(1),若,p1=p2,;表明,p1,和,p2,指向数组中的同一个数组元素;,(2),若,p1p2,;表明,p1,所指向的数组元素在,p2,所指向的数组元素后面。,例如:,5.4,通过指针变量操作一维数组,36,例,5.6.3,中,第一次输出时,,p1p2,条件成立,表明,p1,所指向的数组元素在,p2,所指向的数组元素前面;如图,5-3,所示。,5.4,通过指针变量操作一维数组,37,第二次输出时,,p1=p2,条件成立,表明,p1,和,p2,指向数组中的同一个数组元素,如图,5-4,所示。,2,此外,指针变量还可以和零之间进行等于或不等于的关系运算。例如:,p=0,或,p!=0,。,5.4,通过指针变量操作一维数组,38,指针应用举例,例,5.6.4,利用指针技术,将键盘输入的,N,个整数按相反的顺序存放并输出。,思路分析:分别取出数组最前面和最后面的元素,进行交换,即,a0,与,aN-1,交换;然后再分别取出,a1,与,aN-2,交换;直到交换完毕。,算法描述:,for(i=0,j=N-1;ij;i+,j-),定义、输入初始数组的值,指针指向数组的首地址,temp=*(p+i),*(p+i)=*(p+j),*(p+j)=temp,输出交换后数组的值,39,源程序清单:,#include,#include,using namespace std;,int main(void),int a10,i,j,temp,*p;,coutInput ten interger:endl;,for(p=a;p*p;,指针应用举例,40,指针应用举例,p=a;,for(i=0,j=10-1;ij;i+,j-),temp=*(p+i);,*(p+i)=*(p+j);,*(p+j)=temp;,for(p=a;pa+10;p+),coutsetw(4)*p;,coutendl;,return 0;,41,指针应用举例,编程技巧:,1,定义指针变量操作一维数组,定义后把指针变量指向数组的首地址,用循环输入各个数组元素的值。,2,再次使用指针变量操作数组前,必须要明确指针变量的指向,即指针变量再次指向数组的首地址,用语句“,p=a;”,实现。,3,利用了两个变量,i,,,j,并赋初值后,用*,(p+i),、*,(p+j),分别取出数组中首尾元素的值进行交换,然后使,i+,、,j-,分别再取出数组中第二个元素的值和倒数第二个元素的值进行交换,直到交换完毕,即条件,ij,不成立。,42,例,5.6.5,把一个整数插入到一个由小到大的有序数列中,并仍然保持由小到大的顺序。,思路分析:,设有,10,个整数按由小到大的顺序存放在,a,数组中,待插入的数存放在变量,x,中,如:,10,个有序数依次为:,2 4 6 8 12 16 17 20 30 40,,待插入的数:,x=11,。,要插入的数,8x=11ap&p10),p*(t+p)&p=a+p,成立,*,(t+1)=*t,t-,t=a+p,;指针指向要插入的位置,*t=x,;插入值,输出插入完成后的数组,45,指针应用举例,#include,#include,using namespace std;,void main(void),const int N=10;,int aN+1,p=0,x,*t,;,cout“,输入,a,数组:”,endl,;,for(t=a,;,t*t,;,cout“,输入待插入的数,x,:”,x,;,46,指针应用举例,t=a,;,while(x*(t+p)&p=a+p,;,t-),*(t+1)=*t,;,t=a+p,;,*,t=x,;,for(t=a,;,t=a+N,;,t+),coutsetw(3)*t;,47,指针应用举例,编程技巧:,1,在定义数组时,要考虑到插入后数组元素的长度增加了一个,定义时要在原数组长度的基础上加一。例如:,例,5.6.5,中,定义数组为:,int aN+1,。,2,要注意指针变量在使用后的指向,再次操作时要赋初值,例如:,例,5.6.5,中,,t=a,;让指针变量再次指向数组的首地址。,48,例,5.6.6,编写程序,用指针技术删除字符串末尾的所有空格。,思路分析:,用指针操作字符串,首先把指针指向字符串末尾的字符,取出其末尾字符的值,进行判断是否等于空格,若等于就删除,即把指针指向前一个字符,指针减,1,,再取出倒数第二个字符进行判断是否等于空格,等于就进行同样的操作,直到不等于,就说明字符串末尾已经没有空格,操作完成,需要给字符串末尾加上结束标志,0,。,指针应用举例,49,指针应用举例,定义,string s1,表示字符串,定义,char,型指针变量*,p,操作,字符串,定义操作中用到的变量,n,j,输入含有末尾空格的字符串,找到末尾字符:,n=s1.size();j=n-1;,指针变量*,p,赋初值:,p=,当,while(*(p+j)=,空格,),j-;,加字符串结束标志“,0”,输出删除末尾空格后的字符串,50,源程序清单:,#include,#include,using namespace std;,void main(void),int n,j;,string s1=;,char*p;,cout,输入需要删除末尾空格的字符串,:endl;,getline(cin,s1);,cout,未删除末尾空格前的字符串为,:endls1,字符串结束标志!,endl;,n=s1.size();,指针应用举例,51,指针应用举例,j=n-1;,p=,while(*(p+j)=)j-;,*(p+j+1)=0;,cout,删除末尾空格后的字符串为,:endls1,字符串结束标志!,endl;,编程技巧:,1,用,string,数据类型,加头文件,#include,。,2,由于输入字符串含有空格,输入时必须用,getline(cin,s1),函数实现输入。,3,用,s1.size(),函数求出字符串的长度,n,,包含字符串的实际长度,字符数组是从下标,0,开始,最后一个字符的位置应为,n-1,。,4,用语句:,p=&s10,对指针变量进行赋初值。,52,应用举例,例6-1 从键盘输入整数集合,a、b,的元素个数和各个元素的值,计算并输出其交集。,源程序清单如下:,#,include,#include,void main(void),const int M=20,N=10;,int aM,bN,cM;,int d,e,f=0,*pa,*pb,*pc;,cout,输入数组,a,中元素的个数:d;,53,cout,输入数组,a,的,d,个元素:,endl;,for(pa=a;pa*pa;,cout,输入数组,b,中元素的个数:e;,cout,输入数组,b,的,e,个元素:,endl;,for(pb=b;pb*pb;,for(pa=a,pc=c;paa+d;pa+),for(pb=b;pbb+e;pb+),应用举例,54,if(*pa=*pb),*pc+=*pa;,f+;,break;,cout,交集,c,的各个元素依次为:,endl;,for(pc=c;pcc+f;pc+),coutsetw(3)*pc;,应用举例,55,例6-2 从键盘输入整数集合,a、b,的元素个数和各个元素的值,计算并输出其并集。,源程序清单如下:,#,include,#include,void main(void),const int M=20,N=10;,int aM,bN,cM+N;,int d,e,f=0,*pa,*pb,*pc;,应用举例,56,cout,输入数组,a,中元素的个数:d;,cout,输入数组,a,的,d,个元素:,endl;,for(pa=a;pa*pa;,cout,输入数组,b,中元素的个数:e;,cout,输入数组,b,的,e,个元素:,endl;,for(pb=b;pb*pb;,应用举例,57,for(pa=a,pc=c;paa+d;pa+,pc+),*pc=*pa;f+;,for(pb=b;pbb+e;pb+),for(pa=a;pa=a+d),*pc+=*pb;f+;,cout,交集,c,的各个元素依次为:,endl;,for(pc=c;pcc+f;pc+),coutsetw(3)*pc;,应用举例,58,5.5,二维数组与指针,例,5.12,运用指针的方法编程实现:输出如下二维数组各元素的值。,int a34=1,2,3,4,5,6,7,8,9,10,11,12,源程序清单一:,#include,#include,using namespace std;,void main(),int a34=1,2,3,4,5,6,7,8,9,10,11,12,59,int*p;,for(p=a0;pa0+12;p+),if(p-a0)%4=0)coutendl;,coutsetw(4)*p;,coutendl;,5.5,二维数组与指针,60,源程序清单二:,#include,#include,using namespace std;,void main(void),int a34=1,2,3,4,5,6,7,8,9,10,11,12;,int*p3,i,j;,for(i=0;i3;i+),pi=ai;,5.5,二维数组与指针,61,for(j=0;j4;j+),coutsetw(4)*(pi+j);,coutendl;,编程技巧:,通过前面的学习我们知道,二维数组在计算机里实际上是转换成一维数组来存储的,是按行方式存放的。,5.5,二维数组与指针,62,在操作二维数组时,指向二维数组的指针变量的定义、赋值和使用与指向一维数组的指针变量基本相同。,具体操作二维数组时,一般常用两种方法:,用指针变量使用数组元素,此方法是把二维数组转换成一维数组来操作,定义指针变量先指向首地址,然后通过指针变量“移动”来操作具体的数组元素。,定义指针数组使用数组元素,指针数组就是数组中每个元素是指针,用它来指向一维数组。,5.5,二维数组与指针,63,5.13,利用指针技术,求,55,阶方阵主对角线的和。,思路分析:,55,的方阵用二维数组,a55,表示,定义一个指针数组*,p5,来操作数组;求主对角线的和,先找到主对角线上的元素,应满足条件行号等于列号,再进行累加。,算法描述:,5.5,二维数组与指针,64,源程序清单:,#include,using namespace std;,void main(void),int a55,*p5,i,j,sum=0;,cout“,请输入方阵的值:,”endl;,for(i=0;i*(pi+j);,5.5,二维数组与指针,65,for(i=0;i5;i+),pi=ai;,for(j=0;j5;j+),if(i=j),sum=sum+*(pi+j);,cout“,方阵的对角线之和为:,”sumendl;,5.5,二维数组与指针,66,6.10 存储分配,静态存储分配:,程序中,使用的变量和数组的类型、数目和大小是在编写程序时由程序员分配确定下来的,因此在程序运行时这些数据占据的存储空间数也是一定的。这种存储分配方法被称为,静态存储分配,。,缺点:在程序运行时,无法根据具体情况灵活调整存储分配情况。,动态存储分配:,在程序运行过程中按照实际需要申请适量的内存单元,使用结束后还可以释放,这种存储分配方法被称为,动态存储分配,。,67,运算符,new,的功能是动态分配内存,形式为:,=,new ;,或 =,new (初值);,=,new ;为数组申请内存,运算符,delete,用于释放先前申请到的内存单元,形式为:,delete ;,6.10 存储分配,68,例,int*ptr=new int(5);,delete ptr;,float*ptr=new float(2);,例:,#include,int main(),int x,*ptr=new int(5);int i;,x=*ptr;,coutx*ptrendl;,6.10 存储分配,69,delete ptr;,ptr=new int10;,for(i=0;i10;i+),*ptr=i;,cout*ptrendl;ptr+;,return 0;,6.10 存储分配,70,6.11 指针与引用的区别,引用是一种特殊类型的变量,可以被认为是另一个变量的别名。,而指针是存储单元的地址。,引用运算符“&”用来声明一个引用,在声明语句中。,而指针中的地址运算符“&”用在执行语句中,引用与指针二者截然不同。,例:,int i;,int /refi,是,i,的别名,例:,int*p,i=3;,p=/,执行语句,71,例1:引用作参数,#,include,void swap(int,void main(void),int x(5),y(10);,coutx=xy=yendl;,swap(x,y);,coutx=xy=yendl;,6.11 指针与引用的区别,72,void swap(int&a,int&b),int t;,t=a;,a=b;,b=t;,6.11 指针与引用的区别,x,与,a,指向同一,个存储单元,y,与,b,指向同一,个存储单元,x a,5,y b,10,参数没有传递,73,例2 指针作参数,#,include,void swap(int*a,int*b);,void main(void),int x(5),y(10);,coutx=xy=yendl;,swap(/,地址运算符,coutx=xy=yendl;,6.11 指针与引用的区别,74,void swap(int*a,int*b),int t;,t=*a;,*a=*b;,*b=t;,6.11 指针与引用的区别,x,的地址,y,的地址,a,b,x(5),y(10),a,b,75,76,此课件下载可自行编辑修改,仅供参考!感谢您的支持,我们努力做得更好!谢谢,
展开阅读全文