【问题标题】:Difference in passing by pointer -C++指针传递的区别-C++
【发布时间】:2012-07-17 14:19:20
【问题描述】:

下面的代码有什么不同:-

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

 int a;
 function(&a);

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

两种代码的工作方式是否相同或有什么不同?

在效率方面也有什么区别吗?有那么重要吗?

谢谢

【问题讨论】:

  • 这里没有引用(除非你有一个指针的引用),但是如果你不能添加它们,使用第二个。至少,在处理这种情况时,我从来不需要使用第一个。
  • 您的代码中没有引用。在这两种情况下,您都是通过指针传递的。因为这个原因没有区别。如果您打算询问有关参考的问题,请查看您的问题。
  • 抱歉错了,那么引用传递是什么意思?
  • @Aditya,常见问题解答:stackoverflow.com/questions/57483/…
  • stackoverflow.com/questions/7058339/… 这是何时使用的常见问题解答

标签: c++ pointers


【解决方案1】:

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

例子:

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

还有

你不能声明一个引用数组:

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

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

【讨论】:

  • 不好意思没看懂,能不能举例说明一下?
【解决方案2】:

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

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

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
}

【讨论】:

  • 是的,标题具有误导性。
  • 如果你从表面上看问题,那基本上是一派胡言。我假设@andrew 正在阅读字里行间,这很有帮助。
  • @KarolisJuodelė:是的,我误解并被标题误导了。但我想我会留下答案,因为它提供了作者可能感兴趣的一些信息
  • 那么引用传递是什么意思呢?
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2020-08-16
      • 2018-04-05
      • 1970-01-01
      • 2020-04-10
      • 2013-04-03
      • 1970-01-01
      • 2010-10-10
      • 2015-05-19
      • 1970-01-01
      相关资源
      最近更新 更多