我有这样的密码
typedef struct
{
unsigned char arr[15]; //size = 15bytes
unsigned char str_cks; //size = 1byte
}iamstruct; //Total Size = 16bytes
typedef union
{
iamstruct var;
unsigned char union_cks[16];
}iamunion; //Total Size = 16bytes
static iamunion var[2];
int main()
{
printf("The size of struct is %d\n",sizeof(iamstruct)); //Output = 16
printf("The size of union is %d\n",sizeof(iamunion)); //Output = 16
var[1].union_cks[1] = 2;
printf("%d",var[1].union_cks[1] ); // Output =2
return 0;
}我混淆了联合内部的struct变量声明以及它是如何工作的?
这样做的主要目的是什么&它如何提高可访问性?
请分享你的想法。
提前谢谢。
我现在从下面的代码中理解了一些东西。在此,分配的内存为16字节,其全部由联合的单个成员共享。
typedef struct
{
unsigned char str_cks1;
unsigned char str_cks2;
unsigned char str_cks3;
unsigned char str_cks4;
unsigned char str_cks5;
unsigned char str_cks6;
unsigned char str_cks7;
}iamstruct;
typedef union
{
iamstruct var;
unsigned char union_cks[7];
}iamunion;
static iamunion var[7];
int main()
{
int i = 0;
printf("The size of struct is %d\n",sizeof(iamstruct));
for(i=0;i<7;i++)
{
var[i].var.str_cks1 = (i*1);
var[i].var.str_cks2 = (i*2);
var[i].var.str_cks3 = (i*3);
var[i].var.str_cks4 = (i*4);
var[i].var.str_cks5 = (i*5);
var[i].var.str_cks6 = (i*6);
var[i].var.str_cks7 = (i*7);
}
for(i=0;i<7;i++)
{
printf("%d\t",var[i].var.str_cks1);
printf("%d\t",var[i].var.str_cks2);
printf("%d\t",var[i].var.str_cks3);
printf("%d\t",var[i].var.str_cks4);
printf("%d\t",var[i].var.str_cks5);
printf("%d\t",var[i].var.str_cks6);
printf("%d\t",var[i].var.str_cks7);
printf("\n");
}
return 0;
}输出:在这里输入图像描述
发布于 2019-11-22 07:22:47
struct表示其所有字段类型的笛卡尔乘积对应的值。这些值是字段值的有序连接,都存在于每个结构值中。从这个意义上说,您将看到字段中的所有值都是值的元组或序列,它们所代表的字段的每个类型。
相反,union代表了内部每个字段的另一种选择,因此类型的整个值集是其内部每种类型的简单联合。
因此,组合( union和struct)可以确保您可以设置一个有序的值序列(struct),或者将struct字段看作是联合的一个选项。简单,对!:) (您也可以将union作为struct的字段,这意味着序列中的字段是可能的值集的另一种选择。
让我们用一个例子来看它。让我们假设您有一个变量,它应该存储真正的或复杂的值。对于Real,您只需使用一个普通的float值(我将故意地对其进行复杂处理,以查看它是如何扩展的),对于复杂,我们将使用两个double值(此选择与另一种选择无关,与float对double的精度损失无关):
struct complex {
double real_part, imaginary_part;
};然后
union {
float real_number;
struct complex complex_number;
} my_variable;然后,您可以访问my_variable.real_number作为单精度float值,my_variable.complex_number.real_part和my_variable.complex_number.imaginary_part作为复数的双精度double实部和虚部。
请注意,这不是将值从实值转换为复杂值的方法,反之亦然。实际上,在本例中,两种类型的值在内部都有不同的表示形式,如果在变量上存储一个精确的float实数,并尝试将其访问为复数(您必须从外部管理存储在变量中的值类型,以便知道如何访问它),变量中可存储的值集将是实数的整组float值,加上(或)整组符合复数的double对或实部和假想部分。这就是提取union保留字的地方。
重要的是要考虑类型表示在该类型的变量中可存储的一组值。通过这种方式,struct允许您存储字段所代表的每种类型的值,您可以同时在变量上存储所有这些类型的值,而union只允许您决定您将使用哪种类型(以及哪个字段)来存储--只存储这些字段备选方案中的一个值,而不超过一个。
https://stackoverflow.com/questions/58965626
复制相似问题