代码之家  ›  专栏  ›  技术社区  ›  Homer Jay Simpson

通过c++解释中的引用传递

  •  0
  • Homer Jay Simpson  · 技术社区  · 1 年前

    我正在自学c++,我被指针卡住了。特别是在调用指针并更改它们的不同函数中。我知道,对于在座的大多数人来说,这很简单,但如果有人能帮助我,我需要一些解释。我正在macOS上使用Xcode来运行c++。

    我的代码是:

    
    #include <iostream>
    
    int a = 2, b = 17, c = 1;
    
    void p(int a, int &c) {
        int b = a * c++;
        std::cout <<a <<" "<< b <<" "<< c << std::endl;
        if (4 * a > c) {
            p(b / 2, a);
            std::cout <<a <<" "<< b <<" "<< c << std::endl;
        }
    }
    
    int main() {
    
        p(c, a);
        std::cout <<a <<" "<< b <<" "<< c << std::endl;
        return 0;
    }
    

    输出:

    1 2 3
    1 1 2
    0 0 2
    2 1 2
    2 2 3
    3 17 1
    

    一开始它会调用 p(a=1,c=2) 哪里 c 是一个指针。以及 c++ 是第一次取消引用吗 c 然后它递增 c 一个。因此 a = 1, b=3 , c = 3 .为什么 a = 1, b = 2, c = 3 ?

    1 回复  |  直到 1 年前
        1
  •  1
  •   Serge Ballesta    1 年前

    在C语言的早期,唯一的调用约定是 按值传递 这意味着函数只接收其参数的副本,如果它更改了参数,则只有局部副本会更改,并且当函数返回时,外部变量仍具有其初始值。因此,为了允许函数更改一些变量,我们 指针 这些变量必须在函数内部取消引用。示例代码:

    void p(int a, int *c) {
        int b = a * (*c)++;  // outer c variable is increased
        std::cout <<a <<" "<< b <<" "<< *c << std::endl; // this is not C language ;-)
        ...
    }
    ...
    p(c, &a);    // explicitely pass a pointer to a
    

    给我们 明确地 传递外部变量的地址( &c )并且仍然明确地取消对函数内部指针的限制( *c )。

    虽然显式可能很好,但这意味着要用大量的 & * 这对初学者来说不是很友好。。。

    然后C++带来了 参考文献 。通过引用传递变量时,函数不再具有外部变量的副本,而是直接使用它。以前的代码可以变成:

    void p(int a, int &c) {
        int b = a * c++;  // outer c variable is increased thanks to the reference
        std::cout <<a <<" "<< b <<" "<< c << std::endl;
        ...
    }
    ...
    p(c, a);    // implicitely pass a reference to a