(&(state.a)+sizeof(int));
此时修改*b就能影响到gpr[1]了。
你若要修改
gpr[1].x值 ,只需修改 *b就行,,
你若要修改
gpr[1].y值 ,也只需修改 *b就行,,
首先,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数组的使用。