指针具有相同的内存地址,具有不同的值

Har*_*ngh 7 c++

我将内存地址从double转换为整数.即使他们指向相同的地址,为什么值不同?

#include<iostream>
using namespace std;

int main()
{
    double d = 2.5;
    auto p = (int*)&d;
    auto q = &d;
    cout<<p<<endl; // prints memory address 0x7fff5fbff660
    cout<<q<<endl; // print memory address  0x7fff5fbff660
    cout<<*p<<endl; //prints 0
    cout<<*q<<endl; // prints 2.5
    return 0;

}
Run Code Online (Sandbox Code Playgroud)

但为什么价值不同

0x7fff5fbff660
0x7fff5fbff660
0
2.5
Program ended with exit code: 0
Run Code Online (Sandbox Code Playgroud)

Dav*_*rtz 10

假设你在一张纸上写了"11".如果它是十进制数字,那就是11.如果每个值都有一个标记,那就是两个.如果它是二进制的那就是三个.如何解释存储的信息会影响您理解存储的值.


Som*_*ken 7

这是因为你违反了严格的别名规则,给你未定义的行为.你不能通过类型B的指针访问类型A,只是假装它工作.


TL; DR:

如果你有一个int*指向包含一个内存的内存int然后你指向一个float*内存并将其用作float你打破规则.如果您的代码不遵守这一点,那么编译器的优化器很可能会破坏您的代码.


mks*_*eve 7

double d = 2.5;
auto p = (int*)&d;
auto q = &d;
Run Code Online (Sandbox Code Playgroud)

创建指向同一内存位置的p和q.内存保持一个双(通常是8个字节)

当你创建

auto p = (int*)&d;
Run Code Online (Sandbox Code Playgroud)

你告诉compiler(reintepret_cast< int*> ( &d))d中的值是一个整数.

所以指针的值是相同的,但类型不是.

当你打印出来

cout<<*q<<endl; // prints 2.5
Run Code Online (Sandbox Code Playgroud)

您正在显示正确的值 - 因为它是通过它进出的.

当你打印出来

cout<<*p<<endl; //prints 0
Run Code Online (Sandbox Code Playgroud)

您正在查看8字节内存的4个(通常)字节,并将它们解释为整数.

这些恰好是0x00,0x00,0x00,0x00