【问题标题】:What is (int*)?什么是 (int*)?
【发布时间】:2014-09-30 14:00:26
【问题描述】:

我试图访问该类的私有数据成员。在我遇到int* 之前,一切都很顺利。我不明白它是什么。我认为这是我们可以用来创建新内存地址的东西。 我的代码:

#include <iostream>
using namespace std;

class x
{
    int a, b, c, d;

public:
    x()
    {
        a = 100;
        b = 200;
        c = 300;
        d = 400;
    }
};

int main()
{
    x ob;
    int *y = (int *)&ob;
    cout << *y << " " << y[1] << " " << y[2] << " " << y[3] << endl;
}

谁能帮助我理解它?

【问题讨论】:

  • google it..你可以在堆栈溢出中找到很多
  • 这是 C 风格的演员表。
  • 你对 C++ 了解多少?它正在投射一个指向 int* 类型的指针。这可能会破坏现代别名规则(我永远记不得了),因此通常可能不会那样做。在这里,您假设 int 存储为类的前几个元素,这取决于类中是否有任何虚函数或您是否使用 RTTI 编译,这可能是正确的,也可能不是。
  • I came up with the。你对指针一无所知,但你想出了int *y = (int*)&amp;ob;?酷:)

标签: c++ pointers


【解决方案1】:

它是一种 c 风格的强制转换,将结构 x 占用的内存作为一组整数访问。

它获取ob 的地址,将它从'address of'(即指向)x 的指针转换为指向int 的指针。编译器很乐意将此强制转换分配给 y,因此您可以对其进行操作,或者在这种情况下,将内存块打印为整数。由于该结构恰好是一组整数,因此即使有点破解,它也可以正常工作。我猜最初的编码员想要打印出所有 4 个整数,而不必通过变量名依次指定每个整数。懒惰。

尝试使用转换为 char*(即一次 1 个字节)并将其打印出来。您将基本上打印出结构占用的原始内存。

一个好的 C++ 方法是 create an operator<< function,它返回每个格式化为这样输出的变量,然后改写 cout &lt;&lt; ob &lt;&lt; endl;

【讨论】:

  • “懒惰”,是的,尤其是 int *y = &amp;ob.a; 不需要演员表,也不是 hack。通过这个指针访问其他成员仍然很难看。
猜你喜欢
  • 1970-01-01
  • 2016-02-26
  • 2011-03-15
  • 2011-01-26
  • 1970-01-01
  • 2015-06-17
  • 1970-01-01
  • 2015-02-11
  • 2015-08-28
相关资源
最近更新 更多