C 和 C++ 指针传递和引用传递混淆

Ste*_*879 2 c c++ pointers reference

所以我了解如何将地址传递给 C 函数以避免传递值。但我不明白的是在 C++ 中通过引用传递。我对 C 缺乏理解,如果你要通过引用传递变量,你只会int根据地址得到一个无意义的值。比如如果你这样做了:

int x = 5;
int* p = x;
int y = p;
Run Code Online (Sandbox Code Playgroud)

y将是一个无意义的int值。所以我不明白基于上述逻辑的C++引用传递。是否有一些编译器识别您正在尝试执行的操作,以便它以使其等效于 C 代码的方式进行编译?有关 C 和 C++ 按指针和按引用传递的信息,请参阅下文:

// C pass by pointer value
void main() {
    int a = 1;
    int b = 2;

    swap(&a, &b);
    }

void swap(int* a, int* b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

// C++ pass by reference
void main() {
    int a = 1;
    int b = 2;

    swap(a, b);
    }

void swap(int &a, int &b) {
    int temp = a;
    a = b;
    b = temp;
}
Run Code Online (Sandbox Code Playgroud)

Dút*_*has 5

你问的问题会引发圣战。

\n

对象

\n

对象是某种事物的实例:它有自己的内存和一切。我们代码中的许多对象都有名称

\n
int number_of_birds_in_hand = 0;\nstd::string users_name = "Fred";\n
Run Code Online (Sandbox Code Playgroud)\n

您会看到模式:类型、名称、值。

\n

名称是对对象的直接引用,或别名

\n

指针

\n

指针是对对象的间接引用。它们是间接的,因为它们本身就是对象,有自己的名称和值:

\n
const char * filename = "hello.txt";\n
Run Code Online (Sandbox Code Playgroud)\n

我们往往会混淆它,因为它看起来filename"hello.txt",但事实并非如此。filename\xe2\x80\x99s 值是文本的地址。我们可以随时更改该地址:

\n
filename = "goodbye.txt";\n
Run Code Online (Sandbox Code Playgroud)\n

(就像 C 和 C++ 中的任何变量一样,我们可以告诉编译器不要让我们这样做,使用:const char * const filename。)

\n

我们取消引用指针以获得对该对象的直接引用。直接引用没有名称,但它解析为与具有该对象\xe2\x80\x99s 名称相同。

\n
int x = 12;\nint * y = &x;\n*y = -7;\n
Run Code Online (Sandbox Code Playgroud)\n

该构造*y解析为对 的直接引用(或别名)x:访问*y与访问相同x。但y它本身只是对其自身对象值的引用。

\n

参考

\n

C++ 添加了一个新的构造,称为引用。从语言的角度来看,这正是它的本质:对象的另一个名称。

\n
int x = 12;\nint & y = x;\ny = -7;\n
Run Code Online (Sandbox Code Playgroud)\n

这里, 和x都是y同一对象的别名(或直接引用)!

\n

圣战

\n

我们谈论这些事情的方式让人们继续前进。C++ 标准有一种方法可以做到这一点。纵观历史,CS 文学还有另外一种。非常聪明、知识渊博的人可能对这个话题有不同的看法。

\n

我个人在用 C 语言交谈时将指针作为引用没有问题。但在 C++ 中,这种语言会与真正的引用(而不是指针的间接引用)混淆。

\n

人们喜欢争论的一个常见问题是引用是否真的是指针。答案是视情况而定。有时是,有时是\xe2\x80\x99t。

\n

这是一个幼稚的说法,因为从 C++ 语言提供的角度来看,它们是不同的东西。它们在底层的工作方式实际上只对编译器的开发人员重要。

\n

然后你就得到了整个指针传递圣战......但最好把这个留给另一个不同的问题。

\n

最后的想法

\n

诀窍是理解人们提到这些东西时的意思,如果你不确定,就问。如果有人对你提到它的方式感到大声和愤怒,只要尝试使用他们使用过的术语即可。他们可以在没有你的情况下生小牛。

\n

在常见的 C++ 中,您有对象值、指针和引用,并且根据您询问的对象,它们永远不会被混淆。如果你不确定,就说你传递了一个指向函数的指针,这样你就可以取消引用它来获取目标值,呵呵。

\n