为什么引用和指针不能一起使用?

Why can't a reference and a pointer be used together?

本文关键字:一起 不能 引用 指针 为什么      更新时间:2023-10-16

我是C开发的历史,最近一直在研究C++。我一直在研究"&"的含义,并且对为什么它不能与指针结合使用感到非常困惑。

到目前为止,我将参数中由"&"声明的任何变量解释为总是通过基本上总是取消引用变量并更改变量来更改值隐式*variable = ...。类似于是否正在传递指针,并且值更改始终是通过取消引用值来实现的。

所以这让我想到,为什么下面的C++代码是不可接受的?

为什么我不能将指针传递给使用"&"接受参数的函数。函数中使用的值等效于 '*r = ..."对于 R 完成的所有赋值

#include <iostream>
#include <string>
using namespace std;
void square(int& r) {
r = r * r;
}
void x() {
int org = 5;
int* orgp = &org;
square(orgp);
std::cout << org;
}
int main(void) 
{ 
x();
return 0;
}

因为指针是指针,引用是引用;但是,您可以使用一元*运算符(取消引用)获取给定指针的引用:

void x() {
int org = 5;
int* orgp = &org;
square(*orgp);   // ok
std::cout << org;
}

对称地,您可以使用一元&获取给定引用的指针(注意:您无法获取引用的地址,您将获得的是引用值的地址)。

指向int的指针和int的引用是不同的类型。指针是内存中的地址,引用是别名;它是int变量的另一个名称。除了语言抽象之外,引用int背后的数据是一个int。指针和int(通常)是不同大小的对象,它们总是具有不同的语义。它们不能互换。

您可以通过引用传递指针变量指向的值(即*orgp):

void x() {
int org = 5;
int* orgp = &org;
square(*orgp);
std::cout << org;
}

从评论:

引用只是某个变量的另一个名称。[axiac]

至少,这是看待此事的好方法。

从技术上讲,实际上在某些情况下,引用实际上根本没有实现:

int a = 7;
int& b = a;

编译器很可能会直接使用a在任何地方使用 b,而不是创建真正的引用。

对于函数参数(除非,如果函数是内联的)或者如果在引擎盖下捕获返回值,引用很可能会保存它引用的变量的地址,就像指针一样。一旦编译,我几乎怀疑你能区分这两个重载

int f(int& n) { return  n; }
int f(int* p) { return *p; }

一个来自另一个,而不是被破坏的名字。

技术。。。从用户的角度来看,保留引用的注释仍然更容易,即使引用的变量位于函数外部,让引用显式实现或不显式实现。你只是逃脱了最简单的。

关于正确的用法 - 嗯,已经答案了,所以这个只是贡献一些背景......