在以下代码中,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;
}
谢谢你的时间!
另见
答案 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()
中,x
和y
总是指同一个东西。在指针版本中,您可以(在更复杂的函数中)重新分配x
和y
以指向其他内容,这可能会使逻辑不那么清晰(是的,您可以将参数声明为{{ 1}}以避免这种重新分配。)
参考版本的功能主体看起来更干净,因为它没有那么多星星。
答案 3 :(得分:2)
这不是表示法的问题。
有三种方法可以将参数传递给函数:
在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 ¶m)
是现代C ++风格,使用引用(围绕原始指针的类型安全包装)。如果您使用的是C ++,则应该使用引用。
答案 6 :(得分:1)
由于这些原因,在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
我相信它们都有它们的用途 - 和指针一样,你可以做更多的低级内存操作,但引用的语法更容易。
:)