首页 > 解决方案 > 将整数变量地址分配给类指针

问题描述

#include<iostream>
using namespace std;

class Child {
public:
    int b;
    void gotoSchool() {
        cout << "going to school";
    }
};

int main( )
{
    int a; 
    Child *p2 = (Child *) &a;  // #2
    p2->gotoSchool();

    return 0;
}

这段代码的输出是

going to school

但这是如何工作的?如何将整数类型转换为用户定义的类?请向我解释一下这个场景背后的概念。

标签: c++pointers

解决方案


你在那里做的只是投射一个地址而不是一个整数。对于您的计算机,整数是一系列字节(在 32 位处理器中为 4 个字节),我们将其设为 8。这个整数有一个地址(在 32 位处理器中也是 4 个字节),假设该地址的值是 1。

在您的代码中,您正在转换 a 的地址。所以,指针 p2 有它的地址。根据定义,指针是地址。您的类“Child”将在强制转换中采用的参数是“a”之后的字节值,直到它填充其数据。在这种情况下,数据是单个 int,因此“a”的值和 Child“b”的值将是相同的。指针只是一个内存地址,它可以是任何类型(将类视为您想要的类型)。类型只告诉指针数据的大小以及如何解释它。现在你很不幸,类型与整数完全吻合。但通常这种铸造的行为是不受重视的。我已经修改了您的代码以说明正在发生的事情,我认为您在执行后会更清楚地看到它

#include<iostream>

using namespace std;


class Child {


public:
  float b;
  Child(){ b = -0.5;};
  void gotoSchool(){
  cout<<"going to school" << endl;}
  void changeValue(){ b = -0.5;};
  void displayB()
  {
     cout << "the value of b is " << b << endl;
  };
};

class OriginalChild {
public:
   int b;
   void gotoSchool(){
   cout<<"going to school";}
};

int main( )
{
  int a = 8;
  Child *p2 = (Child *) &a;  // #2
  OriginalChild *p3 = (OriginalChild *) &a;
  p2->gotoSchool();

  cout << a << endl;
  p2->displayB();
  cout << p3->b << endl;

  p2->changeValue();
  cout << a << endl;
  return 0;
}  

推荐阅读