首页 > 解决方案 > 为什么不能将两个地址加在一起?

问题描述

假设我定义了两个变量xy

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++pointersinteger-arithmetic

解决方案


简短的回答:因为 C++ 标准是这样说的。

长答案:因为它没有意义。永远不会有将两个地址相加会产生任何用处的情况。

当您向地址添加(或减去)整数偏移量时,您会到达位于地址给定偏移量处的对象。非常有用,基本上是所有数组操作的基础。

但是如果你把两个地址加在一起,我们会到达内存中一个完全随机的位置,你不能指望在那里找到任何有价值的东西。因此,语言不允许你这样做,编译器拒绝编译这段代码。

但是,如果您只需要两个地址的数字表示之和的数字表示(例如,对于复杂的运行时混淆),则可以使用专门为此设计的类型来完成:uintptr_t. 以下是有效代码:

auto z = uintptr_t(&x) + uintptr_t(&y);

推荐阅读