我有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;
}
答案 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,所以这个只是在提供一些背景知识……