用C语言在数组中存储相似的联合

用C语言在数组中存储相似的联合,c,arrays,unions,C,Arrays,Unions,我有一个联盟的定义如下: typedef union opWord { struct { unsigned short ARE : 2; unsigned short opDest : 2; unsigned short opSource : 2; unsigned short opcode : 4; unsigned short group : 2; unsigned short u

我有一个联盟的定义如下:

typedef union opWord
{
    struct
    {
        unsigned short ARE : 2;
        unsigned short opDest : 2;
        unsigned short opSource : 2;
        unsigned short opcode : 4;
        unsigned short group : 2;
        unsigned short unused : 3;
    } word;
    unsigned short fullReg;
} opWord;
union {
    opWord op;
    immediate imm;
} instructions[1000];
和另一个非常相似的,仅在位字段排列上有所不同:

typedef union immediate
{
    struct
    {
        unsigned short ARE : 2;
        unsigned short imm : 13;
    } word;
    unsigned short fullReg;
} immediate;
这些数据是否可以以某种方式存储在同一个数组中,因为它们只随位的排列而变化

差不多

opWord instructions[1000]?
如果没有,有没有一种方法可以作为链表来完成?
我如何声明指针呢?

您不能在同一数组中直接存储类型为
opWord
immediate
的对象。您不能声明这样一个数组,如果您试图用指针转换和/或动态分配的空间来处理它,那么您将遇到严格的别名规则

您可以创建一个
联合
类型,成员为
opWord
immediate
,并按照@jxh在注释中的建议创建该类型的数组。以最简单、最简洁的形式,可能如下所示:

typedef union opWord
{
    struct
    {
        unsigned short ARE : 2;
        unsigned short opDest : 2;
        unsigned short opSource : 2;
        unsigned short opcode : 4;
        unsigned short group : 2;
        unsigned short unused : 3;
    } word;
    unsigned short fullReg;
} opWord;
union {
    opWord op;
    immediate imm;
} instructions[1000];

您还可以考虑将两个并集类型合并为一个,并创建该类型的数组:

union instruction {
    struct {
        unsigned short ARE : 2;
        unsigned short opDest : 2;
        unsigned short opSource : 2;
        unsigned short opcode : 4;
        unsigned short group : 2;
        unsigned short unused : 3;
    } opWord;
    struct {
        unsigned short ARE : 2;
        unsigned short imm : 13;
    } immediate;
    unsigned short fullReg;
};

union instruction instructions[1000];

这减少了所涉及的层数,这可能很有用,但代价是丢失两种指令的单独类型。

您不能将类型为
opWord
immediate
的对象直接存储在同一数组中。您不能声明这样一个数组,如果您试图用指针转换和/或动态分配的空间来处理它,那么您将遇到严格的别名规则

您可以创建一个
联合
类型,成员为
opWord
immediate
,并按照@jxh在注释中的建议创建该类型的数组。以最简单、最简洁的形式,可能如下所示:

typedef union opWord
{
    struct
    {
        unsigned short ARE : 2;
        unsigned short opDest : 2;
        unsigned short opSource : 2;
        unsigned short opcode : 4;
        unsigned short group : 2;
        unsigned short unused : 3;
    } word;
    unsigned short fullReg;
} opWord;
union {
    opWord op;
    immediate imm;
} instructions[1000];

您还可以考虑将两个并集类型合并为一个,并创建该类型的数组:

union instruction {
    struct {
        unsigned short ARE : 2;
        unsigned short opDest : 2;
        unsigned short opSource : 2;
        unsigned short opcode : 4;
        unsigned short group : 2;
        unsigned short unused : 3;
    } opWord;
    struct {
        unsigned short ARE : 2;
        unsigned short imm : 13;
    } immediate;
    unsigned short fullReg;
};

union instruction instructions[1000];

这样可以减少所涉及的层数,这可能很有用,但代价是丢失两种指令的单独类型。

创建两个并集的并集?创建两个并集的并集?