为什么我必须将地址转换为整数以使其可分配?

3 c++ pointers

指针在堆上或堆栈上存储地址.经过一番搜索,我试图了解什么是"地址"; 我发现它只是一个映射内存区域的整数值.

  • 我想知道:只要一个地址只是一个整数,为什么我不能将它分配给一个整数变量:

    #include <iostream>
    using std::cout;
    using std::endl;
    
    int main()
    {
        int  a    = 1024;
        int* ptrA = &a;
    
        cout << "ptrA: " << ptrA << endl;   //  0018FF44
        cout << "*ptrA: " << *ptrA << endl; //  1024
        cout << "&a: " << &a << endl;       //  0018FF44
        cout << "a: " << a << endl;         //  1024
    
    //  int b = ptrA;      // why this is incorrect
        int b = (int)ptrA; // why I need this?
    
        cout << "b: " << std::hex << b << endl; //  18FF44
    
        // so b is identic to ptrA!
    
        std::cout << std::endl;
        return 0;
    }
    
    Run Code Online (Sandbox Code Playgroud)

Sam*_*hik 7

主要原因有两个.

  1. 一个int可能不是大到足以存储一个指针值.这是一个特定于实现的细节.在64位平台上找到C++实现仍然很常见,它具有64位内存地址,其中a int只有32位.

  2. 类型安全.编译器存在不同类型的原因之一是捕获明显的错误,例如在指向不同类的指针时使用指向一个类的指针.如果对于每个对象的所有指针都只是简单的整数,那么这些错误将被解读.