关闭

关闭

关闭

封号提示

内容

首页 c++中的引用与指针的区别.doc

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

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

上传者: youyouwzy 2012-02-28 评分 0 0 0 0 0 0 暂无简介 简介 举报

简介:本文档为《c++中的引用与指针的区别doc》,可适用于IT/计算机领域,主题内容包含c++中的引用与指针的区别   相同点:   都是地址的概念   指针指向一块内存它的内容是所指内存的地址引用是某块内存的别名。   区别:   指符等。

c++中的引用与指针的区别   相同点:   都是地址的概念   指针指向一块内存它的内容是所指内存的地址引用是某块内存的别名。   区别:   指针是一个实体而引用仅是个别名   引用使用时无需解引用(*)指针需要解引用   引用只能在定义时被初始化一次之后不可变指针可变   引用“从一而终”^^   引用没有const指针有constconst的指针不可变   引用不能为空指针可以为空   “sizeof引用”得到的是所指向的变量(对象)的大小而“sizeof指针”得到的是指针本身(所指向的变量或对象的地址)的大小   typeid(T)==typeid(T)恒为真sizeof(T)==sizeof(T)恒为真但是当引用作为成员时其占用空间与指针相同(没找到标准的规定)。   指针和引用的自增()运算意义不一样   联系   引用在语言内部用指针实现(如何实现?)。   对一般应用而言把引用理解为指针不会犯严重语义错误。引用是操作受限了的指针(仅容许取内容操作)。   引用是C中的概念初学者容易把引用和指针混淆一起。一下程序中n是m的一个引用(reference)m是被引用物(referent)。   intm   intn=m   n相当于m的别名(绰号)对n的任何操作就是对m的操作。例如有人名叫王小毛他的绰号是“三毛”。说“三毛”怎么怎么的其实就是对王小毛说三道四。所以n既不是m的拷贝也不是指向m的指针其实n就是m它自己。   引用的一些规则如下:   ()引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)。   ()不能有引用引用必须与合法的存储单元关联(指针则可以是)。   ()一旦引用被初始化就不能改变引用的关系(指针则可以随时改变所指的对象)。   以下示例程序中k被初始化为i的引用。语句k=j并不能将k修改成为j的引用只是把k的值改变成为由于k是i的引用所以i的值也变成了   inti=   intj=   intk=i   k=jk和i的值都变成了   上面的程序看起来象在玩文字游戏没有体现出引用的价值。引用的主要功能是传递函数的参数和返回值。C语言中函数的参数和返回值的传递方式有三种:值传递、指针传递和引用传递。   以下是“值传递”的示例程序。由于Func函数体内的x是外部变量n的一份拷贝改变x的值不会影响n所以n的值仍然是  voidFunc(intx){x=x}intn=Func(n)cout<<“n=”<<n<<endln=    以下是“指针传递”的示例程序。由于Func函数体内的x是指向外部变量n的指针改变该指针的内容将导致n的值改变所以n的值成为  voidFunc(int*x){(*x)=(*x)}#intn=Func(n)cout<<“n=”<<n<<endln=    以下是“引用传递”的示例程序。由于Func函数体内的x是外部变量n的引用x和n是同一个东西改变x等于改变n所以n的值成为  voidFunc(intx){x=x}#intn=Func(n)cout<<“n=”<<n<<endln=     对比上述三个示例程序会发现“引用传递”的性质象“指针传递”而书写方式象“值传递”。实际上“引用”可以做的任何事情“指针”也都能够做为什么还要“引用”   这东西?   答案是“用适当的工具做恰如其分的工作”。   指针能够毫无约束地操作内存中的如何东西尽管指针功能强大但是非常危险。   就象一把刀它可以用来砍树、裁纸、修指甲、理发等等谁敢这样用?   如果的确只需要借用一下某个对象的“别名”那么就用“引用”而不要用“指针”以免发生意外。比如说某人需要一份证明本来在文件上盖上公章的印子就行了如果把取公章的钥匙交给他那么他就获得了不该有的权利。      摘自「高质量c++编程」   指针与引用在MoreEffectiveC的条款一有详细讲述我给你转过来   条款一:指针与引用的区别   指针与引用看上去完全不同(指针用操作符‘*’和‘>’引用使用操作符‘。’)但是它们似乎有相同的功能。指针与引用都是让你间接引用其他对象。你如何决定在什么时候使用指针在什么时候使用引用呢?   首先要认识到在任何情况下都不能用指向空值的引用。一个引用必须总是指向某些对象。因此如果你使用一个变量并让它指向一个对象但是该变量在某些时候也可能不指向任何对象这时你应该把变量声明为指针因为这样你可以赋空值给该变量。相反如果变量肯定指向一个对象例如你的设计不允许变量为空这时你就可以把变量声明为引用。   “但是请等一下”你怀疑地问“这样的代码会产生什么样的后果?”   char*pc=设置指针为空值   charrc=*pc让引用指向空值   这是非常有害的毫无疑问。结果将是不确定的(编译器能产生一些输出导致任何事情都有可能发生)应该躲开写出这样代码的人除非他们同意改正错误。如果你担心这样的代码会出现在你的软件里那么你最好完全避免使用引用要不然就去让更优秀的程序员去做。我们以后将忽略一个引用指向空值的可能性。   因为引用肯定会指向一个对象在C里引用应被初始化。   stringrs错误引用必须被初始化   strings("xyzzy")   stringrs=s正确rs指向s   指针没有这样的限制。   string*ps未初始化的指针   合法但危险   不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针的要高。因为在使用引用之前不需要测试它的合法性。 voidprintDouble(constdoublerd){    cout<<rd不需要测试rd,它}肯定指向一个double值相反指针则应该总是被测试防止其为空:voidprintDouble(constdouble*pd){    if(pd)    {检查是否为          cout<<*pd    }}    指针与引用的另一个重要的不同是指针可以被重新赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被指定的对象以后不能改变。  strings("Nancy")strings("Clancy")stringrs=srs引用sstring*ps=sps指向srs=srs仍旧引用s,但是s的值现在是"Clancy"ps=sps现在指向ss没有改变    总的来说在以下情况下你应该使用指针一是你考虑到存在不指向任何对象的可能(在这种情况下你能够设置指针为空)二是你需要能够在不同的时刻指向不同的对象(在这种情况下你能改变指针的指向)。如果总是指向一个对象并且一旦指向一个对象后就不会改变指向那么你应该使用引用。   还有一种情况就是当你重载某个操作符时你应该使用引用。最普通的例子是操作符这个操作符典型的用法是返回一个目标对象其能被赋值。  vector<int>v()建立整形向量(vector)大小为向量是一个在标准C库中的一个模板(见条款)v=这个被赋值的目标对象就是操作符返回的值如果操作符返回一个指针那么后一个语句就得这样写:*v=    但是这样会使得v看上去象是一个向量指针。因此你会选择让操作符返回一个引用。(这有一个有趣的例外参见条款)   当你知道你必须指向一个对象并且不想改变其指向时或者在重载操作符并为防止不必要的语义误解时你不应该使用指针。而在除此之外的其他情况下则应使用指针假设你有 voidfunc(int*p,intr)inta=intb=func(a,b)    指针本身的值(地址值)是以passbyvalue进行的你能改变地址值但这并不会改变指针所指向的变量的值   p=someotherpointeraisstill   但能用指针来改变指针所指向的变量的值   *p=anowis   但引用本身是以passbyreference进行的改变其值即改变引用所对应的变量的值   r=bnowis   尽可能使用引用不得已时使用指针。   当你不需要“重新指向”时引用一般优先于指针被选用。这通常意味着引用用于类的公有接口时更有用。引用出现的典型场合是对象的表面而指针用于对象内部。   上述的例外情况是函数的参数或返回值需要一个“临界”的引用时。这时通常最好返回获取一个指针并使用指针来完成这个特殊的使命。(引用应该总是对象的别名而不是被解除引用的指针)。   注意:由于在调用者的代码处无法提供清晰的的引用语义所以传统的C程序员有时并不喜欢引用。然而当有了一些C经验后你会很快认识到这是信息隐藏的一种形式它是有益的而不是有害的。就如同程序员应该针对要解决的问题写代码而不是机器本身。

用户评论(0)

0/200

精彩专题

上传我的资料

每篇奖励 +2积分

资料评价:

/7
1下载券 下载 加入VIP, 送下载券

意见
反馈

立即扫码关注

爱问共享资料微信公众号

返回
顶部