有什么区别?因为:
int Value = 50;
int *pValue = &Value;
*pValue = 88;
和ref版本也是这样:
int Value = 50;
int &rValue = Value;
rValue = 88;
哪一个更好用?感谢。
答案 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;
}
}