指针将地址存储在堆中或堆栈中。经过一番搜索,我试图理解什么是“地址”。我发现它只是映射内存区域的整数值。

  • 我想知道:只要地址只是一个整数,为什么我不能将其分配给一个整数变量:
    #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;
    }
    
  • 最佳答案

    有两个主要原因。

  • int可能不足以存储指针值。这是特定于实现的细节。在具有64位内存地址(其中int只有32位)的64位平台上找到C++实现仍然很常见。
  • 类型安全。存在不同类型的原因之一是,编译器会捕获明显的错误,例如在期望使用指向不同类的指针时使用指向一个类的指针。如果所有指向每个对象的指针都是纯整数,则这些错误将不会被捕获。
  • 08-19 12:50