c++中引用与指针的区别

c++中引用与指针的区别

ID:11691493

大小:23.76 KB

页数:6页

时间:2018-07-13

上传者:U-4187
c++中引用与指针的区别_第1页
c++中引用与指针的区别_第2页
c++中引用与指针的区别_第3页
c++中引用与指针的区别_第4页
c++中引用与指针的区别_第5页
资源描述:

《c++中引用与指针的区别》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

  ★相同点:   1.都是地址的概念;   指针指向一块内存,它的内容是所指内存的地址;引用是某块内存的别名。   ★区别:   1.指针是一个实体,而引用仅是个别名;   2.引用使用时无需解引用(*),指针需要解引用;   3.引用只能在定义时被初始化一次,之后不可变;指针可变;   引用“从一而终”^_^   4.引用没有const,指针有const,const的指针不可变;   5.引用不能为空,指针可以为空;   6.“sizeof引用”得到的是所指向的变量(对象)的大小,而“sizeof指针”得到的是指针本身(所指向的变量或对象的地址)的大小;   typeid(T)==typeid(T&)恒为真,sizeof(T)==sizeof(T&)恒为真,但是当引用作为成员时,其占用空间与指针相同(没找到标准的规定)。   7.指针和引用的自增(++)运算意义不一样;   ★联系   1.引用在语言内部用指针实现(如何实现?)。   2.对一般应用而言,把引用理解为指针,不会犯严重语义错误。引用是操作受限了的指针(仅容许取内容操作)。   引用是C++中的概念,初学者容易把引用和指针混淆一起。一下程序中,n是m的一个引用(reference),m是被引用物(referent)。   intm;   int&n=m;   n相当于m的别名(绰号),对n的任何操作就是对m的操作。例如有人名叫王小毛,他的绰号是“三毛”。说“三毛”怎么怎么的,其实就是对王小毛说三道四。所以n既不是m的拷贝,也不是指向m的指针,其实n就是m它自己。    引用的一些规则如下:   (1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)。   (2)不能有NULL引用,引用必须与合法的存储单元关联(指针则可以是NULL)。   (3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。   以下示例程序中,k被初始化为i的引用。语句k=j并不能将k修改成为j的引用,只是把k的值改变成为6.由于k是i的引用,所以i的值也变成了6.   inti=5;   intj=6;   int&k=i;   k=j;//k和i的值都变成了6;   上面的程序看起来象在玩文字游戏,没有体现出引用的价值。引用的主要功能是传递函数的参数和返回值。C++语言中,函数的参数和返回值的传递方式有三种:值传递、指针传递和引用传递。   以下是“值传递”的示例程序。由于Func1函数体内的x是外部变量n的一份拷贝,改变x的值不会影响n,所以n的值仍然是0. voidFunc1(intx){x=x+10;}intn=0;Func1(n);cout<<“n=”<’,引用使用操作符‘。’),但是它们似乎有相同的功能。指针与引用都是让你间接引用其他对象。你如何决定在什么时候使用指针,在什么时候使用引用呢?    首先,要认识到在任何情况下都不能用指向空值的引用。一个引用必须总是指向某些对象。因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量。相反,如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为引用。   “但是,请等一下”,你怀疑地问,“这样的代码会产生什么样的后果?”   char*pc=0;//设置指针为空值   char&rc=*pc;//让引用指向空值   这是非常有害的,毫无疑问。结果将是不确定的(编译器能产生一些输出,导致任何事情都有可能发生),应该躲开写出这样代码的人除非他们同意改正错误。如果你担心这样的代码会出现在你的软件里,那么你最好完全避免使用引用,要不然就去让更优秀的程序员去做。我们以后将忽略一个引用指向空值的可能性。   因为引用肯定会指向一个对象,在C里,引用应被初始化。   string&rs;//错误,引用必须被初始化   strings("xyzzy");   string&rs=s;//正确,rs指向s   指针没有这样的限制。   string*ps;//未初始化的指针   //合法但危险   不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针的要高。因为在使用引用之前不需要测试它的合法性。 voidprintDouble(constdouble&rd){    cout<v(10);//建立整形向量(vector),大小为10;//向量是一个在标准C库中的一个模板(见条款35)v[5]=10;//这个被赋值的目标对象就是操作符[]返回的值如果操作符[]返回一个指针,那么后一个语句就得这样写:*v[5]=10;   但是这样会使得v看上去象是一个向量指针。因此你会选择让操作符返回一个引用。(这有一个有趣的例外,参见条款30)   当你知道你必须指向一个对象并且不想改变其指向时,或者在重载操作符并为防止不必要的语义误解时,你不应该使用指针。而在除此之外的其他情况下,则应使用指针假设你有voidfunc(int*p,int&r);inta=1;intb=1;func(&a,b);    指针本身的值(地址值)是以passbyvalue进行的,你能改变地址值,但这并不会改变指针所指向的变量的值,   p=someotherpointer;//aisstill1   但能用指针来改变指针所指向的变量的值,   *p=123131;//anowis123131   但引用本身是以passbyreference进行的,改变其值即改变引用所对应的变量的值   r=1231;//bnowis1231   尽可能使用引用,不得已时使用指针。   当你不需要“重新指向”时,引用一般优先于指针被选用。这通常意味着引用用于类的公有接口时更有用。引用出现的典型场合是对象的表面,而指针用于对象内部。   上述的例外情况是函数的参数或返回值需要一个“临界”的引用时。这时通常最好返回/获取一个指针,并使用NULL指针来完成这个特殊的使命。(引用应该总是对象的别名,而不是被解除引用的NULL指针)。   注意:由于在调用者的代码处,无法提供清晰的的引用语义,所以传统的C程序员有时并不喜欢引用。然而,当有了一些C++经验后,你会很快认识到这是信息隐藏的一种形式,它是有益的而不是有害的。就如同,程序员应该针对要解决的问题写代码,而不是机器本身。

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭