将`class`指针强制转换为`float`数组:它是如何工作的?

时间:2015-08-17 11:53:20

标签: c++ arrays casting

以下代码令我惊讶地编写。你能解释一下它是如何工作的吗?我最不了解的一点是,铸造的c阵列如何与班级成员完全匹配。

#include <iostream>

class ClassA
{
    public:
        float ArbitraryVariableName1;
        float ArbitraryVariableName2;
        float ArbitraryVariableName3;
        float ArbitraryVariableName4;
        float ArbitraryVariableName5;
        float ArbitraryVariableName6;
        float ArbitraryVariableName7;
        float ArbitraryVariableName8;
        float ArbitraryVariableName9;
};

typedef float Float3[3];
typedef Float3 * Matrix;

int wmain(int argc, wchar_t * argv[])
{
    ClassA md;
    Matrix mat = (Matrix) & md;
    // Matrix mat = reinterpret_cast<Matrix>(&md); // This one also works.

    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            mat[i][j] = (i + 1) * (j + 1);
        }
    }

    for (int j = 0; j < 3; j++)
    {
        for (int i = 0; i < 3; i++)
        {
            std::cout << mat[i][j] << '\t';
        }
        std::cout << std::endl;;
    }

    system("timeout 60");
    return 0;
}

输出:

1       2       3
2       4       6
3       6       9

1 个答案:

答案 0 :(得分:0)

因为你的9个浮点类和9个浮点数的数组平均存储在内存中:

1111 2222 3333 4444 5555 6666 7777 8888 9999

因此,当您将类转换为数组时,它可以正常工作。但是如果不使用不同大小的对象,则可能会出现分段错误。