C ++:在函数/方法声明中和号“&”和星号“*”之间的区别?

那些之间有一些微妙的区别:

void a1(float &b) { b=1; }; a1(b); 

 void a1(float *b) { (*b)=1; }; a1(&b); 

它们都是一样的(或者看起来像main()),但是第一个显然更短,但是我看到的大部分代码都使用第二个符号。 有区别吗? 也许万一它是一些对象,而不是浮动?

两者都是一样的,但是一个使用引用,一个使用指针。

在这里看到我的答案全面列出了所有的差异 。

是。 *符号表示什么是通过堆栈是一个指针,即地址的东西。 &说这是一个参考。 效果相似但不相同:

我们来看两个例子:

  void examP(int* ip); void examR(int& i); int i; 

如果我打电话给examP ,我写

  examP(&i); 

它将该项目的地址传递给堆栈。 如果我打电话给examR

  examR(i); 

我不需要它; 现在编译器“以某种方式”传递一个引用 – 这实际上意味着它获取并传递了i的地址。 然后在代码方面

  void examP(int* ip){ *ip += 1; } 

我必须确保取消引用指针。 ip += 1做了非常不同的事情。

  void examR(int& i){ i += 1; } 

总是更新i的价值。

为了更多的思考,请阅读“通过参考来电”与“按价值来电”。 &概念给C ++调用引用。

在引用的第一个示例中,您知道b不能为NULL。 用指针的例子, b可能是NULL指针。

但是,请注意,可以通过引用传递一个NULL对象,但是它很笨拙,被调用的过程可能会认为这是错误的:

 a1(*(float *)NULL); 

在第二个例子中, 调用者必须在variables名前添加'&'来传递variables的地址。

这可能是一个优点 – 调用者不会无意中通过将其作为参考传递给variables,从而无意中修改variables。

除了语法糖之外,唯一真正的区别是指针的函数参数为null的能力。 因此,如果指针版本能够正确处理空值,那么它可以更具有performance力。 空例也可以有一些特殊的含义。 参考版本只能操作指定types的值,而不能使用空值。

function上在你的例子中,两个版本都是一样的。

第一个优点是在通话端透明。 想象一下如何找一个操作员:

 cin >> &x; 

以及交换调用的外观如何丑陋

 swap(&a, &b); 

你想交换a和b。 而且看起来比你第一次接电话要好得多。 顺便提一句,bjarne stroustrup写道,引用的主要原因是在呼叫方增加的透明度 – 特别是对于运营商。 也看下面是不是再明显了

 &a + 10 

将10添加到a的内容,调用它的operator +,或者是否将10添加到一个临时指针。 添加到不可能的,你不能重载运营商只内置操作数(如一个指针和一个整数)。 参考文献使这个晶体清晰。

指针是有用的,如果你想能够把一个“空”:

 a1(0); 

然后在a1中,该方法可以将指针与0进行比较,查看指针是否指向任何对象。

值得注意的一个很大的区别是外面发生了什么,你可能有:

 a1(something); 

要么:

 a1(&something); 

我喜欢通过引用来传递参数(总是一个const 🙂 :),当它们没有在函数/方法中修改(然后你也可以在里面传递自动/临时对象),并通过指针传递它们来表示和提醒用户/代码的读者调用的方法,该参数可能和可能被有意修改里面。