12

在下面的代码中,两者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;
}

谢谢你的时间!


也可以看看

C++中指针变量和引用变量的区别

4

8 回答 8

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

于 2008-10-10T08:50:17.880 回答
4

还可以提出一个论点,以使指针版本优于参考版本。事实上,从文档的角度来看,它是优越的,因为调用者知道输入参数将被修改。比较这两个调用:

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

当然,就swap函数而言,这一点是没有实际意义的。每个人都知道它的论点将被修改。还有其他情况不太明显。ref正是出于这个原因,C# 才有了关键字。在 C# 中,上面的内容必须如下所示:

swap(ref a, ref b);

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

于 2008-10-10T09:10:25.903 回答
2

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

不能重新分配引用以指向其他内容。所以,你知道在 function中,amp_swap()that总是指同一个东西。在指针版本中,您可以(在更复杂的函数中)重新分配并指向其他内容,这可能会使逻辑不太清晰(是的,您可以声明参数以避免这种重新分配)。xyxyint *const x

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

于 2008-10-10T08:50:40.297 回答
2

这不是符号问题。

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

  1. 按价值
  2. 引用
  3. 通过指针

amp_swap您通过引用传递实际参数。这仅在 C++ 中引入并有效。

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

基本上,如果您使用 C++,建议使用引用,因为它对变量更具可读性。如果您需要指针,请务必使用它们。

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

于 2008-10-10T08:56:51.267 回答
2

如果你看这里,你可以找到指针与引用的描述,最有用的信息最初来自这个引用。

C++ 不允许您声明“const 引用”,因为引用本质上是 > const。换句话说,一旦你绑定一个引用来引用一个对象,你就不能重新绑定它来引用另一个对象。声明引用后,没有重新绑定引用的符号。

以下绑定 ri 以引用 i。

int &ri = i;

然后是一个任务,例如:

ri = j;

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

希望这更清楚。

于 2008-10-10T09:03:20.787 回答
1

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

于 2008-10-10T08:50:05.993 回答
1
  • 与指针一样,引用可以修改作为参数传递的数据
  • 与指针一样,引用支持多态性
  • 与指针不同,引用永远不会为 NULL(您仍然可以通过一些技巧来实现这一点,但是,这更像是破坏而不是编码......)
  • 与指针不同,引用在 const 时启用类型提升(即,具有一个带有 std::string 参数的函数接受 char *)
  • 与指针不同,引用不能被重新分配:没有办法在代码的某个点修改它,而指针可以在一个点指向 A,在另一个点指向 B,而在另一个点又指向 NULL。而且您不想将 ++ 错误地应用于您的指针...
  • 与指针不同,引用使数据的操作与使用“int”或“bool”之类的原语一样容易,而无需一直使用 * 运算符

由于这些原因,在 C++ 中,引用使用通常是默认的,而指针是例外。

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

于 2008-10-10T20:34:09.227 回答
0

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

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

我相信它们都有它们的用途——就像指针一样,您可以进行更多的低级内存操作,但引用的语法更容易。

:)

于 2008-10-10T08:49:55.087 回答