为什么不能同时使用引用和指针?

3
我曾从事 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;
}

正如您所指出的,解引用指针会给您一个引用。*r = ...。但是指针到引用之间没有自动转换,它们基本上是两种不同的类型。因此,如果您将指针传递给需要引用的函数,则会出现错误,因为编译器无法将指针转换为引用以使其成为参数。 - Martin York
3个回答

5
因为指针是指针,引用是引用。但是你可以使用一元运算符(解引用)*通过指针获得一个引用:
void x() {
    int org = 5;

    int* orgp = &org;

    square(*orgp);   // ok

    std::cout << org;
}

同样地,使用一元运算符 &,可以从引用中获取指针(注意:不能获取引用的地址,而是要获取引用值的地址)。

2
一个指向int的指针和一个int的引用是不同的类型。指针是内存中的地址,引用是别名;它是int变量的另一个名称。除了语言抽象之外,引用到int背后的数据是int。指针和int是(通常)不同大小的对象,它们始终具有不同的语义。它们不能互换。
您可以通过引用传递指针变量所指向的值(即*orgp):最初的回答
void x() {
    int org = 5;

    int* orgp = &org;

    square(*orgp);

    std::cout << org;
}

2

从评论中看:

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

至少,这是看待这个问题的一种好方法。

从技术上讲,实际上确实有一些情况,其中引用根本没有被实现:

Original Answer翻译成"最初的回答"

int a = 7;
int& b = a;

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

对于函数参数(除非该函数是内联的),或者在幕后捕获返回值时,引用很可能会保持其所引用变量的地址,就像指针一样。一旦被编译,我怀疑你几乎无法区分这两个重载

"Original Answer" 翻译成 "最初的回答"

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

除了被扭曲的名称之外,从另一个中获得一个变量。

从技术上讲...从用户的角度来看,即使引用的变量位于函数之外,使用引用是否明确实现,仍然更容易只留在引用的注释中。你只需要选择最简单的方法。

关于正确的用法——好吧,已经有了答案,所以这篇文章只是贡献了一些背景知识...

最初的回答: 技术上说,即使变量在函数外部引用时,只需保留注释中的引用,而不管引用是否明确实现,从用户的角度来看,这仍然是最简单的方法。此外,本文只是为其他答案提供一些背景知识。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接