将整数变量地址分配给类指针

时间:2018-07-31 06:42:07

标签: c++ pointers

#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

但是这如何工作?如何将整数类型转换为用户定义的类?请向我解释这种情况背后的概念。

1 个答案:

答案 0 :(得分:0)

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

在您的代码中您要投射的地址。因此,指针p2具有其地址。根据定义,指针是地址。您的“ Child”类将在转换中采用的参数是“ a”之后的字节值,直到填充其数据为止。 在这种情况下,数据是单个整数,因此“ a”的值和子级“ 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;
}