c++ - 为什么不能将两个地址加在一起?
问题描述
假设我定义了两个变量x
和y
:
int x = 5;
int y = 6;
我可以x
通过以下方式获取存储地址:
cout << &x << endl; // 0x61fe18
这是一个十六进制数。现在,如果我想在加 5 后打印这个数字,这相当简单:
cout << &x + 5 << endl; // 0x61fe1d
但是,如果我将 和 的地址加x
在一起y
:
cout << &x + &y << endl;
我收到一个错误:
invalid operands of types 'int*' and 'int*' to binary 'operator+' cout << &x + &y << endl; ~~~^~~~
为什么我不能添加两个地址?
解决方案
简短的回答:因为 C++ 标准是这样说的。
长答案:因为它没有意义。永远不会有将两个地址相加会产生任何用处的情况。
当您向地址添加(或减去)整数偏移量时,您会到达位于地址给定偏移量处的对象。非常有用,基本上是所有数组操作的基础。
但是如果你把两个地址加在一起,我们会到达内存中一个完全随机的位置,你不能指望在那里找到任何有价值的东西。因此,语言不允许你这样做,编译器拒绝编译这段代码。
但是,如果您只需要两个地址的数字表示之和的数字表示(例如,对于复杂的运行时混淆),则可以使用专门为此设计的类型来完成:uintptr_t
. 以下是有效代码:
auto z = uintptr_t(&x) + uintptr_t(&y);
推荐阅读
- ios - 更新 Firebase pod 后出现错误。
- sql-server - SQL Server SUM 存储过程以获取没有值的月份的值
- python - 创建火车测试拆分时出现“IndexError:数组索引过多”
- android - Kotlin BitmapFactory IllegalStateException
- php - 带有导致空白页面的参数的 AJAX 页面加载/url
- oracle - 在 sql 查询中避免 group by 子句中的列
- selenium - 如何在 Selenium Webdriver 中的 sendkeys 中传递系统日期(非硬编码)
- javascript - 在 Windows 中测试/调试 Phonegap iOS 应用程序
- python - 两种方式去除重复的开始和结束节点
- sql - 将 CREATE TABLE 更改为 SELECT INTO 时 DATETIME 丢失 hh:mm