为什么引用和指针不能一起使用?
Why can't a reference and a pointer be used together?
我是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; }
一个来自另一个,而不是被破坏的名字。
技术。。。从用户的角度来看,保留引用的注释仍然更容易,即使引用的变量位于函数外部,让引用显式实现或不显式实现。你只是逃脱了最简单的。
关于正确的用法 - 嗯,已经有答案了,所以这个只是贡献一些背景......
- 为什么我不能将 rand() 与数组的大小一起使用?
- 不能将复制初始化与隐式转换的多个步骤一起使用
- Python 3.8 不能与 Pybind11 一起导入 [Windows]
- Turbo C++ cin() 不能与 gets() 一起使用
- 不能将重载比较运算符与 Catch 测试一起使用
- 不能将C++的"std::filesystem"库与介子构建一起使用
- C++程序在将 int 与 cin 一起使用时有效,但不能使用字符串
- std::remove() 按预期处理文字,但不能与取消引用的迭代器一起工作
- 为什么我不能将运算符+与reverse_iterator一起使用?
- 我不能将 'fill' std::vector 构造函数与 unique_ptrs 一起使用
- 为什么引用不能与编译时函数一起使用?
- 为什么我不能将 Windows 环境路径与 ofstream 一起使用来编写文本文件?
- 为什么 std::unordered_map 不能与 const std::string 键一起使用?
- 为什么 std::foreach 不能与 std::vector 一起使用<bool>?
- 为什么原子不能与自动变量一起使用
- 使用 std::vector<Particle> 粒子;函数 .at() 不能与迭代器一起使用,它作为 for 循环中的参数
- 为什么引用和指针不能一起使用?
- 如何将初始值设定项与右值引用参数一起使用 // 为什么不能使用另一个 C 样式数组变量初始化 C 样式数组
- C++:printf 和 wprintf 不能一起工作 (Linux)
- Apple Mach-O Linker (ld) 错误.ld: -r 和 -dead-strip 不能一起使用