union嵌套与union数组

![img](https://img

img


如图所示,我在union数组gpr[2]下面定义了
int变量a,a与gpr[2]被包括在一个union里。经过我的测试,a是与gpr[0]相联合的,即有相同的首地址,占有相同的地址空间,gpr[0].x与gpr[0].y会影响a的值。
但a不与gpr[1]联合,我想再定义一个int型变量b与gpr[1]相联合,如何做到呢?


在外面定义一个int指针,指向你要联合的地址
int * const b=(int *)(&(state.a)+sizeof(int));
此时修改*b就能影响到gpr[1]了。

你若要修改
gpr[1].x值  ,只需修改 *b就行,,
你若要修改
gpr[1].y值  ,也只需修改 *b就行,,



内容来源与ChatGpt4及newbing和百度:


首先,union是一种特殊的数据类型,它允许在同一块内存空间中存储不同的数据类型。当定义一个union时,它的大小为所包含的最大数据类型的大小。这意味着,如果一个union包含一个int和一个float,那么它的大小将是4个字节(int的大小),因为它是两者中最大的。

在union嵌套的情况下,内部的union成员将与外部的union成员共享相同的内存空间。这意味着,当您访问内部union的成员变量时,实际上是访问外部union的成员变量的一部分。这也解释了为什么您的测试表明int变量a与gpr[0]相联合的原因。

下面是一个简单的例子,说明了如何在union中嵌套另一个union:

#include <stdio.h>

union outer {
    int a;
    union inner {
        int b;
        float c;
    } i;
};

int main() {
    union outer o;
    o.a = 10;
    o.i.b = 20;
    o.i.c = 30.0;

    printf("o.a: %d\n", o.a);    // 输出:10
    printf("o.i.b: %d\n", o.i.b);    // 输出:20
    printf("o.i.c: %f\n", o.i.c);    // 输出:30.000000

    printf("Sizeof outer: %ld\n", sizeof(union outer));    // 输出:8
    printf("Sizeof inner: %ld\n", sizeof(union inner));    // 输出:8

    return 0;
}

在这个例子中,我们定义了一个外部union outer,它包含一个int变量a和一个内部union inner。内部union包含一个int变量b和一个float变量c。

然后,我们在主函数中声明了一个outer类型的变量o,并分别将a、b和c的值设置为10、20和30.0。最后,我们打印出每个变量的值,并使用sizeof运算符打印出outer和inner的大小。

这个例子演示了如何在union中嵌套另一个union,并且内部union的成员变量与外部union的成员变量共享相同的内存空间。

对于union数组,它与普通的数组使用方式类似。定义一个union数组时,每个元素都是一个union类型,您可以像访问普通数组一样访问它们的元素。下面是一个简单的例子:

#include <stdio.h>

union my_union {
    int a;
    float b;
};

int main() {
    union my_union arr[3];
    arr[0].a = 10;
    arr[1].b = 20.0;
    arr[2].a = 30;

    printf("arr[0].a: %d\n", arr[0].a);    // 输出:10
    printf("arr[1].b: %f\n", arr[1].b);    // 输出:20.000000
    printf("arr[2].a: %d\n", arr[2].a);    // 输出:30

    return 0;
}

在这个例子中,我们定义了一个my_union类型的数组,它有3个元素。我们将第一个元素的a成员设置为10,将第二个元素的b成员设置为20.0,将第三个元素的a成员设置为30。最后,我们打印出每个元素的成员变量的值。

希望这些例子能够帮助您理解union嵌套和union数组的使用。


祝您问题迎刃而解