1

以下代码有什么区别:-

 int a;
 int *p;
 p=&a;
 function(p);

 int a;
 function(&a);

我正在读一本书,有时他们使用第一个代码,有时使用另一个。虽然它不是一本好书(由当地作者撰写)。

两个代码会以相同的方式工作还是有什么不同?

在效率方面也有任何区别,这有那么重要吗?

谢谢

4

4 回答 4

2

对于引用,对象必须已经存在才能引用它。至于指针,声明指针时对象不需要已经存在

例子:

int &i = 10;       //Invalid
const int &i = 10; //Valid

您不能声明引用数组:

int &tab[] = {2,3};  //Invalid
int * tab[] = {2,3}; //Valid

在实践中,引用多用作函数的参数和返回值;

于 2012-07-17T14:21:57.650 回答
1

据我所知,编译器将引用实现为指针。所以性能上应该没有区别。但是引用更严格,可以保护你不犯错误。例如,您不能重新绑定引用或不能用它们执行算术运算

还有一些人更喜欢将指针传递给修改对象的函数。例如

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
}
于 2012-07-17T14:21:25.240 回答
0

在上述两种方法中,两者都使用指针,除了大小等于 sizeof(int *) 的内存将在堆栈上为“int *p”分配之外没有区别。

如果通过引用调用,请参阅。看起来你是初学者和学习的东西,你会在类中使用复制构造函数时更多地了解引用传递及其使用。

于 2012-07-17T14:33:09.960 回答
0

使用现代编译器编译时,这两个代码片段应该是等效的。额外的声明和赋值 ( p=&a;) 被优化掉了。

于 2012-07-17T14:35:00.807 回答