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

时间:2019-03-06 07:36:23

标签: c++

我有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;
}

3 个答案:

答案 0 :(得分:5)

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

void x() {
    int org = 5;

    int* orgp = &org;

    square(*orgp);   // ok

    std::cout << org;
}

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

答案 1 :(得分:2)

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

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

void x() {
    int org = 5;

    int* orgp = &org;

    square(*orgp);

    std::cout << org;
}

答案 2 :(得分:2)

从评论中:

  

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

至少,这是审视此事的好方法。

从技术上讲,实际上有 个案例实际上根本没有实现引用:

int a = 7;
int& b = a;

无论使用b的哪个位置,编译器很可能会直接使用a而不是创建真实的引用。

对于函数参数(除非可能是内联函数,否则),或者如果在后台捕获返回值,则引用很可能会保存其引用的变量的地址,就像指针一样。一旦编译完成,我怀疑您能否区分这两个重载

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

一个人,但名字不正确。

从技术上讲...从用户的角度来看,即使引用的变量位于函数之外,仅保留引用的注释仍会更容易,无论是否明确实现引用。您就是最轻松地逃脱。

关于正确的用法-嗯,已经有{em> answers,所以这个只是在提供一些背景知识……