C ++参数传递

时间:2016-01-04 06:00:02

标签: c++ parameter-passing

好的,所以我刚开始学习C ++,而且我发现论证的来龙去脉有点令人困惑。我在C ++书中遇到了以下几行;

  

在C ++中,通过引用传递有两种方式:使用指针和使用引用。

然后继续显示一个程序,它切换两个int值x和y的值(如下所示)。我想知道,在这种情况下,swap()函数的参数是否真的通过引用传递了?我以为他们是通过地址传递的,我被告知这只是一个特殊的价值传递。

//Listing 9.6 Demonstrates passing by reference 

#include <iostream.h>

void swap(int *x, int *y);

int main()
{
    int x = 5, y = 10;

    cout << "Main.  Before swap, x:  " << x
         << " y: " << y << "\n";
    swap(&x,&y);
    cout << "Main. After swap, x:  " << x
         << " y: " << y << "\n";
    return 0;
}
void swap(int *px, int *py) 
{
    int temp;

    cout << "Swap.  Before swap, *px: "
         << *px << " *py: " << *py << "\n";

    temp = *px;
    *px = *py;
    *py = temp;

    cout << "Swap. After swap, *px: " << *px
         << " *py: " << *py << "\n";

}

4 个答案:

答案 0 :(得分:2)

抽象级别很好的混淆。

最低级别:当您按值传递C ++指针时,将复制指针值。

更高级别:通常指针指向某个东西,并且某些东西在逻辑上通过引用传递。

在C ++中通过引用传递的最直接方法是使用引用参数。在引擎盖下,C ++引用可以(在某些情况下)是指针,但是无法访问或确定有关该指针值的任何内容。因此,通过值传递或复制引用是没有意义的,而是我们讨论绑定引用或绑定到引用。

在正确的程序中,引用不能是空引用,这是引用作为形式参数类型的明显优势。

另一个优点是对const的引用可以绑定到临时,例如

void foo( const std::string& s ) ...

可以像

一样调用
foo( "Blah!" )

当使用指针“实现”逻辑传递引用时,这是不可能的。

答案 1 :(得分:1)

你是对的。功能

void swap(int *x, int *y);

正在使用 by-value 参数。因为参数是指针,所以它可以取消引用它们,从而修改它们指向的内存。然而,指针本身(地址)按值传递。您可以看到,如果swap为其中一个参数分配了不同的值(地址),则更改不会反映在调用者中。

int a = 1;
int b = 2;
int * pa = &a;
int * pb = &b;
swap(pa, pb);
assert((pa == &a) && (pb == &b));

尝试添加

之类的内容
px += 12;
py += 17;

swap的末尾。 assert离子仍然存在。

在C ++中,指针本身就是一个对象。它有一个值(它指向的地址),可以复制或分配不同的值。它也可以像其他对象一样通过引用或按值传递。

一个按引用引用指针的函数看起来像这样。

#include <iostream>

void
pointer_by_reference(int * & p)
{
  p = nullptr;
}

int
main()
{
  int a;
  int * pa = &a;
  pointer_by_reference(pa);
  std::cout << "&a = " << &a << ", pa = " << pa << "\n";
}

可能的输出:

&a = 0x7ffcfdf2e00c, pa = 0

如您所见,pointer_by_reference更改了pa的价值。

答案 2 :(得分:0)

此处按地址调用,因为您捕获地址变量。如果按引用调用,我们会使用void swap(int &x, int &y);作为原型。

详细信息检查Diff Between Call By Reference And Call By Pointer

还可以查看知识What are the differences between a pointer variable and a reference variable in C++?

答案 3 :(得分:-2)

基本上有两种参数传递技术。

  1. 按值调用
  2. 按引用调用(也称为地址调用)
  3. 您的代码确实是通过引用传递参数。

    使用call-by-value,当数据传递给过程中的参数时,只有该值可用于过程的参数。因此,对过程中的参数所做的任何更改都不会影响调用例程的变量。

    但是通过引用调用,变量的地址可用于参数。换句话说,该参数实际上指向与变量相同的位置。因此,更改过程中的参数实际上会更改传递给它的变量。