func(int¶m)和func(int * param)之间有什么区别?

时间:2008-10-10 08:46:37

标签: c++ pointers reference

在以下代码中,amp_swap()star_swap()似乎都在做同样的事情。那么为什么有人喜欢使用一个而不是另一个呢?哪一个是首选符号,为什么?或者仅仅是品味问题?

#include <iostream>

using namespace std;

void amp_swap(int &x, int &y)
{
    int temp = x;
    x = y;
    y = temp;
}

void star_swap(int *x, int *y)
{
    int temp = *x;
    *x = *y;
    *y = temp;
}

int main()
{
    int a = 10, b = 20;
    cout << "Using amp_swap(): " << endl;
    amp_swap(a, b);
    cout << "a = " << a << ", b = " << b << endl;
    cout << "Using star_swap(): " << endl;
    star_swap(&a, &b);
    cout << "a = " << a << ", b = " << b << endl;
    return 0;
}

谢谢你的时间!


另见

Difference between pointer variable and reference variable in C++

8 个答案:

答案 0 :(得分:13)

一个是使用引用,一个是使用指针。

我会使用带引用的那个,因为你不能传递一个NULL引用(而你可以传递一个NULL指针)。

所以,如果你这样做:

star_swap(NULL, NULL);

您的申请将崩溃。如果你尝试:

amp_swap(NULL, NULL); // This won't compile

除非您有充分的理由使用指针,否则请始终使用引用。

请参阅此链接:http://www.google.co.uk/search?q=references+vs+pointers

答案 1 :(得分:4)

也可以在参考版本上优先使用指针版本。事实上,从文档的角度来看,它是优越的,因为调用者意识到输入参数将被修改的事实;比较这两个电话:

swap(a, b);
swap(&a, &b); // This cries “will modify arguments” loud and clear.

当然,在swap功能的情况下,这一点是没有意义的;大家都知道它的论点会被修改。在其他情况下,这不太明显。出于这个原因,C#具有ref关键字。在C#中,上面的内容必须如下所示:

swap(ref a, ref b);

当然,还有其他方法可以记录此行为。使用指针是这样做的一种有效技术。

答案 2 :(得分:2)

引用不能为NULL。因此,使用第一个版本会阻止调用者将NULL作为函数参数之一传递。

无法重新分配引用以指向其他内容。所以,你知道在函数amp_swap()中,xy总是指同一个东西。在指针版本中,您可以(在更复杂的函数中)重新分配xy以指向其他内容,这可能会使逻辑不那么清晰(是的,您可以将参数声明为{{ 1}}以避免这种重新分配。)

参考版本的功能主体看起来更干净,因为它没有那么多星星。

答案 3 :(得分:2)

这不是表示法的问题。

有三种方法可以将参数传递给函数:

  1. 按价值
  2. 参考
  3. by pointer
  4. amp_swap中,您通过引用传递实际参数。这是在C ++中引入和有效的。

    star_swap中,您使用指针传递参数。这是最初的C-way。

    基本上,如果您使用的是C ++,建议使用引用,因为它对变量更具可读性。如果你需要指针,一定要使用它们。

    请记住在使用引用声明方法时使用&符号,否则会产生错误。如果您未在amp_swap中声明引用,则该函数不会交换任何内容。因为这种方式你使用方法1(仅传递参数值)并且在函数中将创建两个新的自动变量,它们仅存在于函数的范围内。这样就不会触及原始外部变量。

答案 4 :(得分:2)

如果查看here,您可以找到Pointer vs Reference的说明,最有用的信息最初来自此引文。

  

C ++不允许您声明“const引用”,因为引用本身就是&gt;常量。换句话说,一旦绑定引用以引用对象,就不能重新引用它以引用其他对象。在声明引用后,没有用于重新引用引用的表示法。

以下绑定ri以引用i。

int &ri = i;

然后进行如下任务:

ri = j;

不会将ri绑定到j。它将j中的值赋给ri引用的对象,即i。

希望这更清楚。

答案 5 :(得分:1)

(int *param)是旧的C风格,使用直接内存指针。 (int &param)是现代C ++风格,使用引用(围绕原始指针的类型安全包装)。如果您使用的是C ++,则应该使用引用。

答案 6 :(得分:1)

  • 与指针一样,引用可以修改作为参数传递的数据
  • 与指针一样,引用启用了多态性
  • 与指针不同,引用永远不会为NULL(你仍然可以通过一些黑客实现这一点,但是,这更像是破坏而不是编码......)
  • 与指针不同,引用,当const时,启用类型提升(即,具有std :: string参数接受char *的函数)
  • 与指针不同,无法重新分配引用:无法在代码的某个位置修改引用,而指针可以指向一个点的A,另一个指向B,再指向另一个点的NULL 。并且您不希望错误地将++应用于您的指针......
  • 与指针不同,引用使数据的操作像使用“int”或“bool”这样的原语一样简单,而不是一直使用*运算符

由于这些原因,在C ++中,引用通常是默认值,指针是异常。

因此,为了保持一致,在你提出的两个“交换”函数之间,我会使用amp_swap并从源中删除星号(只是为了确保没有人会使用它并在源代码中添加无用的指针代码) )...

答案 7 :(得分:0)

它们与计算机完全相同。但是,一个是引用(&amp;),另一个是指针(*)

http://www.google.com/search?hl=en&q=pointers+vs+references&btnG=Google+Search&aq=1&oq=pointers+vs

我相信它们都有它们的用途 - 和指针一样,你可以做更多的低级内存操作,但引用的语法更容易。

:)