首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >指针传递&引用传递

指针传递&引用传递
EN

Stack Overflow用户
提问于 2011-12-20 05:11:35
回答 5查看 101.2K关注 0票数 49

可能重复: 指针变量和引用变量在C++中有什么区别? 在C++中,通过指针传递而不是通过引用传递有好处吗?

在这两种情况下,我都取得了成果。那么,哪一种优先于另一种?我们用一个而不是另一个的原因是什么?

代码语言:javascript
复制
#include <iostream>
using namespace std;
void swap(int* x, int* y)
{
    int z = *x;
    *x=*y;
    *y=z;
}
void swap(int& x, int& y)
{
    int z = x;
    x=y;
    y=z;
}

int main()
{
    int a = 45;
    int b = 35;
    cout<<"Before Swap\n";
    cout<<"a="<<a<<" b="<<b<<"\n";

    swap(&a,&b);
    cout<<"After Swap with pass by pointer\n";
    cout<<"a="<<a<<" b="<<b<<"\n";

    swap(a,b);
    cout<<"After Swap with pass by reference\n";
    cout<<"a="<<a<<" b="<<b<<"\n";
}

输出

代码语言:javascript
复制
Before Swap
a=45 b=35
After Swap with pass by pointer
a=35 b=45

After Swap with pass by reference
a=45 b=35
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-12-20 05:15:54

引用在语义上如下:

T& <=> *(T * const)

const T& <=> *(T const * const)

T&& <=> [no C equivalent] (C++11)

与其他答案一样,C++常见问题中的以下内容是单行回答:在可能的情况下引用,需要时提供指针。

与指针相比,需要显式转换才能传递NULL。不过还是有可能的。在我测试过的编译器中,没有一个发出以下警告:

代码语言:javascript
复制
int* p() {
    return 0;
}
void x(int& y) {
  y = 1;
}
int main() {
   x(*p());
}
票数 29
EN

Stack Overflow用户

发布于 2011-12-20 05:21:37

实际上,大多数编译器为两个函数调用发出相同的代码,因为引用通常是使用指针实现的。

按照这个逻辑,当函数体中使用(非const)引用类型的参数时,生成的代码将静默地对参数的地址进行操作,并取消引用它。此外,当遇到对这样一个函数的调用时,编译器将生成传递参数地址的代码,而不是复制它们的值。

基本上,从实现的角度来看,引用和指针并没有很大的不同,的主要区别(也是非常重要的)是哲学上的:引用是对象本身,只是用不同的名称。

与指针相比,引用具有更多的优势(例如,它们不能是NULL,所以使用起来更安全)。因此,如果您可以使用C++,那么通过引用传递通常被认为是更优雅的,应该是首选的。但是,在C中,不存在引用传递,所以如果您想编写C代码(或者可怕的命令,用C编译器和C++编译器编译的代码,尽管这不是一个好主意),那么您必须限制自己使用指针。

票数 6
EN

Stack Overflow用户

发布于 2011-12-20 05:18:40

指针传递是C中传递“通过引用”的唯一方法,因此仍然可以看到它被大量使用。

空指针是表示参数未使用或无效的方便约定,因此在这种情况下使用指针。

一旦设置了引用,就不能更新它们,因此,如果需要重新分配引用,请使用指针。

在每一种情况下,如果没有很好的理由不这样做,都更喜欢引用。如果可以的话,让它成为const

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8571078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档