C++ 什么';func(int&;param)和func(int*param)的区别是什么?

C++ 什么';func(int&;param)和func(int*param)的区别是什么?,c++,pointers,reference,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

在下面的代码中,
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;
}
#包括
使用名称空间std;
无效amp_交换(整数和x、整数和y)
{
int-temp=x;
x=y;
y=温度;
}
无效星型交换(int*x,int*y)
{
int temp=*x;
*x=*y;
*y=温度;
}
int main()
{
INTA=10,b=20;

cout它们对于计算机来说是完全相同的东西。但是,一个是引用(&),另一个是指针(*)

我相信它们都有各自的用途——就像指针一样,你可以做更多的低级内存操作,但是引用的语法更简单


<>(p> > <代码>(int *PARAM)< /C>是使用直接内存指针的较老的C样式。<代码>(int and PARAM)< /C>是使用C++(C++)样式,使用引用(在原始指针周围的类型安全包装)。如果使用C++,则可能需要使用引用。

< P>使用引用,一个使用指针。< /P> 我会使用带有引用的引用,因为不能传递NULL引用(而可以传递NULL指针)

因此,如果你这样做:

star_swap(NULL, NULL);
您的应用程序将崩溃。但是,如果您尝试:

amp_swap(NULL, NULL); // This won't compile
除非你有充分的理由使用指针,否则一定要使用引用


请参阅此链接:

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

不能重新分配引用以指向其他对象。因此,您知道在函数
amp_swap()
中,
x
y
始终指向同一对象。在指针版本中,您可以(在更复杂的函数中)重新分配
x
y
以指向其他对象,这可能会使逻辑不那么清晰(是的,您可以将参数声明为
int*const x
,以避免重新分配)


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

这不是符号问题

向函数传递参数有3种方法:

  • 按价值
  • 参照
  • 用指针
  • >代码> AMPSWAPT/ >通过引用传递实际参数。这只是在C++中引入和有效。

    star\u swap
    中,使用指针传递参数。这是原始的C方式

    基本上,如果使用C++,则鼓励使用引用,因为它对变量更可读。如果需要指针,则一定要使用它们。

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

    如果您可以找到指针与引用的描述,最有用的信息最初来自此引用

    C++不允许您声明“const reference”,因为引用本身就是>const的。换句话说,一旦绑定引用以引用对象,就不能将其重新绑定以引用其他对象。声明引用后,没有用于重新绑定引用的符号

    以下内容将ri与i联系起来

    int&ri=i;

    然后是一项任务,例如:

    ri=j;

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


    希望这更清楚。

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

    swap(a, b);
    swap(&a, &b); // This cries “will modify arguments” loud and clear.
    
    当然,在
    swap
    函数的情况下,这一点是没有意义的;每个人都知道它的参数会被修改。在其他情况下,这一点不太明显。C#使用
    ref
    关键字正是出于这个原因。在C#中,上面的内容必须如下所示:

    swap(ref a, ref b);
    
    当然,还有其他方法来记录这种行为。使用指针是一种有效的方法。

    • 与指针一样,引用允许修改作为参数传递的数据
    • 与指针一样,引用也支持多态性
    • 与指针不同,引用永远不会为NULL(您仍然可以通过一些技巧实现这一点,但是,这更类似于破坏,而不是编码…)
    • 与指针不同,当引用为const时,启用类型提升(即,具有一个带有接受char*的std::string参数的函数)
    • 与指针不同,引用不能被重新分配:无法在代码的某个点对其进行修改,而指针可以在某个点指向a,在另一个点指向B,在另一个点指向NULL。并且您不希望由于错误而将++应用于指针
    • 与指针不同,引用使数据的操作与使用“int”或“bool”等原语一样简单,无需始终使用*运算符
    由于这些原因,在C++中,引用使用通常是默认的,指针是例外。


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

    这并不是全部,您所说的是通过引用传递意味着不能传递NULL。这可能是真的,但它是n