以下代码有什么区别:-
int a;
int *p;
p=&a;
function(p);
和
int a;
function(&a);
我正在读一本书,有时他们使用第一个代码,有时使用另一个。虽然它不是一本好书(由当地作者撰写)。
两个代码会以相同的方式工作还是有什么不同?
在效率方面也有任何区别,这有那么重要吗?
谢谢
对于引用,对象必须已经存在才能引用它。至于指针,声明指针时对象不需要已经存在
例子:
int &i = 10; //Invalid
const int &i = 10; //Valid
还
您不能声明引用数组:
int &tab[] = {2,3}; //Invalid
int * tab[] = {2,3}; //Valid
在实践中,引用多用作函数的参数和返回值;
据我所知,编译器将引用实现为指针。所以性能上应该没有区别。但是引用更严格,可以保护你不犯错误。例如,您不能重新绑定引用或不能用它们执行算术运算
还有一些人更喜欢将指针传递给修改对象的函数。例如
void changeVal(int *p)
{
*p = 10;
}
他们说当你看到它时它更具可读性:
changeVal(&var)
比
changeVal(var);
编辑
您可以将其reference
视为它所指对象的另一个名称。因此,对对象所做的所有更改reference
都将应用于该对象。这是一个例子:
void foo_copy(int a) //pass by copy
{
a = 10; //changes copy
}
void foo(int &a) //bass by reference
{
a = 10; //changes passed value
}
void foo(int *a) //pass an adress of a
{
(*a) = 10; //change a value pointed by a
a = nullptr; //change a (the pointer). value is not affected
}
在上述两种方法中,两者都使用指针,除了大小等于 sizeof(int *) 的内存将在堆栈上为“int *p”分配之外没有区别。
如果通过引用调用,请参阅。看起来你是初学者和学习的东西,你会在类中使用复制构造函数时更多地了解引用传递及其使用。
使用现代编译器编译时,这两个代码片段应该是等效的。额外的声明和赋值 ( p=&a;
) 被优化掉了。