【问题标题】:Can Pass by Reference also be called as Pass by Pointer?引用传递也可以称为指针传递吗?
【发布时间】:2020-12-29 15:00:34
【问题描述】:

我目前正在阅读将参数传递给 C 函数的方法。在阅读时,我了解到在 C 语言中有两种方法可以通过值传递和通过引用传递参数。 然后我又读到我们也可以将指向变量的指针作为参数传递。

The beginnersbook website this method is mentioned as pass by reference.

在这个例子中,我们传递一个指向函数的指针。当我们将指针作为参数而不是变量传递时,则传递变量的地址而不是值。因此,函数使用指针所做的任何更改都会永久地在传递变量的地址处进行。这种技术称为C 中的引用调用

我知道当我们需要更改或访问原始变量时,我们可以使用 & 运算符传递一个指针变量或变量的地址。我想知道这个指针传递是否也可以称为引用传递。 指针传递也是引用传递的方法吗?

【问题讨论】:

  • C 没有引用,那是 C++ 的东西。
  • ...在 C++ 中,引用和指针不是一回事
  • C 没有有两种参数传递方法。所有参数都按值传递。按值传递指针仍然是按值传递。
  • 其他一些语言既有按值传递也有按引用传递(例如C++),有的只有按引用传递(例如Fortran)。我想您引用的网站试图为初学者简化,但 IMO 您所描述的表示对他们不利。

标签: c function pointers


【解决方案1】:

从技术上讲,C 中函数的所有参数都是按值传递的。与 C++ 不同,该语言不支持真正的引用。

通过引用传递可以在 C 中模拟,方法是传递(按值)要修改的变量的地址,然后取消引用该地址以修改指向的值。然而,这并不是真正的引用传递。

【讨论】:

  • 所以这种不支持引用一定是我的 C 函数的原因 - void swapNums(int &x, int &y);然后抛出编译时间。谢谢你的澄清。
  • @Outlier 正确,这是 C++ 功能。
  • “这不是真正的传递引用,但是” → 如果你烤蛋糕,它就不是真正的蛋糕,因为你不是从面包店买的。这项工作实际上已经完成:该函数能够访问一个对象,因为它被赋予了对该对象的引用。
【解决方案2】:

C 中的指针是引用。 C 2018 6.2.5 20 说:

...指针类型描述了一个对象,其值提供对被引用类型实体的引用...

当你将一个指针传递给一个函数时,你是在传递一个对指针指向的任何对象的引用。指针本身是按值传递的,但是,因为指针是一个引用并且您正在传递它,所以您通过引用传递对象的描述是准确的。

在C++开发之前,这点是没有争议的;人们说他们通过引用传递一个对象来描述传递一个指向该对象的指针。 C++ 采用“引用”一词作为其语言中新功能的名称,因此,在 C++ 术语中,“引用”通常指的是该功能,除非另有说明或上下文明确。但是,在 C 中,我们不受 C++ 术语的约束,传递引用的原始含义仍然准确。

【讨论】:

    【解决方案3】:

    通常,“c”中函数的所有参数都是“按值”传递的。这意味着如果在函数中修改了参数,则调用者将看不到此修改:

    void foo(int val) {
       ...
       val = newval;
       ...
    }
    void bar() {
       foo(4);
    }
    

    上例中的值val可以修改并在'foo'中使用,但'bar'不会看到更新。

    为了使更新在调用者中可见,使用了指针。

    void foo(int *arg) {
       ...
       *arg = 5;
       ...
    }
    void bar () {
       int x = 4;
       foo(&x);
       // x will be 5 here
    }
    

    在上述情况下,'x' 的地址将被传递给函数 foo,并在函数 *arg 中使用它来修改 'x' 的值。

    可以修改foo内部指针的值,因为它本身是按值传递的

    void foo(int *arg) {
       arg = newAddress;
    }
    

    但函数 'bar' 也不会看到 this 修改。

    因此,在“c”中没有真正的“引用”,但是有些人使用它来引用指针的传递。

    【讨论】:

    • 明白了。谢谢。我还有一个问题。这里的函数被定义为接受指针类型的参数。所以当我们用 & as foo(&x) 调用函数时,我们直接传递了一个地址,对吗?我们不能传递一个指向它的指针吗,我的意思是我应该担心我应该以哪种方式调用函数?
    • int * 是指针类型的声明(指向 int)。指针本质上是数据的地址(在这种情况下是 int 数据)。 &x 是一种获取变量地址的方法。你可以这样声明一个指针并给它赋值:int *y = &x; 然后你可以调用foo(y);
    猜你喜欢
    • 2020-08-15
    • 2015-02-11
    • 2013-01-13
    • 2013-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-16
    • 2012-01-24
    相关资源
    最近更新 更多