取消引用一种类型的地址作为另一种类型的地址

时间:2015-05-15 03:53:09

标签: c++ pointers types casting reference

这个问题适用于允许用户操作指针的任何编码语言,但我特别提到了C ++。

假设我们有两种大小相同的类型,例如,假设(long)和(int)都是8字节大小。让我们声明一个(长)和一个(int):

long someLong = 10;
int someInt = 20;

假设someLongsomeInt的地址分别为X和Y,并假设以十六进制表示,Y = X + 80.如果我尝试手动将X移动到Y然后取消引用它,我没有像我期望的那样得到20的价值。这是为什么?

cout << &someLong + 10    
cout << &someInt             // these two return the same starting address location

cout << *(&someLong + 10)    // dereferences an int as a long, but does not return 20!

1 个答案:

答案 0 :(得分:0)

我认为它在技术上依赖于实现,因此无法保证。

另一方面,根据我的经验,在实践中使用不同类型的指针指向相同的内存往往会按照你期望的方式工作。

而且:

#include <iostream>
using namespace std;

int main()
{
    long someLong = 10;
    int someInt = 20;

    cout << &someLong + 1 << '\n';
    cout << &someInt << '\n';

    cout << *(&someLong + 1);

    return 0;
}

works for me,输出20。

甚至希望回答为什么它不适合你,我们必须看到你的实际代码。它可能有助于了解您正在使用的编译器。