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

问题描述 投票:0回答: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
加 1。因此
a = 1, b=3 , c = 3
。为什么它给出
a = 1, b = 2, c = 3

c++ pointers void
1个回答
0
投票

在 C 语言的早期,唯一的调用约定是“按值传递”。这意味着函数仅接收其参数的副本,如果更改参数,则仅更改本地副本,并且当函数返回时外部变量仍具有其初始值。因此,为了允许函数更改某些变量,我们将pointers传递给这些变量,这些变量必须在函数内取消引用。示例代码: 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(a, &c); // explicitely pass a pointer to c

在这里,我们
显式地

传递外部变量的地址(使用&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(a, c); // implicitely pass a reference to c

© www.soinside.com 2019 - 2024. All rights reserved.