参考与指针

时间:2014-02-19 15:21:20

标签: c++ pointers reference

有什么区别?因为:

int Value = 50;
int *pValue = &Value;

*pValue = 88;

和ref版本也是这样:

int Value = 50;
int &rValue = Value;

rValue = 88;

哪一个更好用?感谢。

6 个答案:

答案 0 :(得分:20)

在这种情况下,它们是等效的。

使用哪个并不重要,也不是“最佳”。

如果你真的想在它们之间做出选择,那么引用可能更具惯用性。我总是坚持参考,因为我的OCD喜欢它:他们感觉“更紧”,不能重新绑定(无论你有没有注意到),并且不需要取消引用来获得价值。

但我不知道对此类案件的任何普遍共识。

另请注意,如果您的实现没有使用指针实现引用,则两者可能无法编译为相同的代码,但我知道没有这样的实现,并且您无论如何都不会注意到差异。

答案 1 :(得分:18)

指针是内存位置的地址。您可以将该地址的值更改为指向不同的内存地址。

引用是变量的别名。您只能在声明期间分配此别名。您无法更改引用声明后别名的变量。


使用引用无法进行以下指针赋值。

int a = 10;
int b = 20;

int* pInt = NULL; // A pointer pointing at nothing.
pInt = &a; // pInt now points at a
pInt = &b; // pInt now points at b

至于哪一个更好,这完全取决于背景。

我使用方法和函数参数的引用。

void updateFoo(Foo& foo)

我使用对别名复杂对象的引用。

Foo& foo = bar.getBaz().getFoo(); // easy access to foo

我使用指针来动态分配对象。

Foo* pFoo = new Foo();

我使用指针指向可能指向不同值的事物(根本不包括任何值)。

Foo* pFoo = NULL;

if (condition1)
    pFoo = &foo1;
else (condition2)
    pFoo = &foo2;

作为一般规则,我默认引用并在引用限制导致问题的地方使用指针。

答案 2 :(得分:11)

区别在于:

Reference是对象的别名,其地址与对象相同。

int a;         //  address of   a : 0x0012AB
int &ref = a;  //  address of ref : 0x0012AB (the same)

参考必须初始化

int &ref = a; // GOOD, is compiling
int &ref;     // BAd, is not compiling

指针是另一个包含地址的变量:

int a = 5;     //  address of a : 0x0012AB 
int *p = &a;   //  address of p : 0x0012AF (is different )

// value of a is 5
// value of p is 0x0012AB  (address of a)

指针可以为NULL

int *p = NULL;

答案 3 :(得分:3)

我的经验法则是赞成使用引用或const引用,除非需要指针。

引用可能无法重新设置,并且语法更清晰。该引用还向您保证引用不是NULL

使用数组时,我也可以使用指针。

答案 4 :(得分:1)

我同意贾斯汀的回答,并希望用最微小的例子来澄清它。

假设您不太记得2D图像几何图形库的语法:它是

bool BooleanOr( const Bitmap & input1, const Bitmap & input2, Bitmap * output );

或者是

bool BooleanOr( Bitmap * output, const Bitmap & input1, const Bitmap & input2 );

如果在你的公司里,每个人都使用输出指针和输入的const引用,那么几乎不可能出错:当你看到诸如

之类的电话时

BooleanOr(thisBitmap,thatBitmap,& anotherBitmap);

你马上就会知道语法。

答案 5 :(得分:1)

这里很棒的答案。我想指出两个具体的参考用法: -

案例1:实施operator[]时。此运算符通常需要返回某些,可用作分配的目标示例: -

vector<int> v(20);
v[1] = 5; //The target of the assignment is the return value of operator []

此处operator []会返回vector中指定索引处元素的引用。如果operator []被设计为将指针返回到指定索引处的元素,那么第二行必须这样写: -

*v[1] = 5

现在让v看起来像是指针的向量 - 它绝对不是!!因此,为了保持理智 - operator []引用而非指针返回到向量中的索引元素

案例2:参考不需要明确的null检查。一些答案已经讨论过 - 希望使用代码片段来展示优势: -

void fun(const int& val)
{
  cout << val;
}

void fun(const int* val)
{
  if (val){ //Additional overhead with pointers
    cout << *val;
  }
}