联合体(共用体) :(笔记补充)

目录

一.联合体的基本概念

二.相关面试题

三.联合体大小计算


关于结构体的内存对齐:http://t.csdn.cn/fbQuo

 一.联合体的基本概念

联合也是一种特殊的自定义类型,这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)

//联合类型的声明
union Un
{
    char c;
    int i;
};
//联合变量的定义
union Un un;

union是声明联合体类型的关键字,Un是联合体类型名.

该联合体的内存布局示意图:

联合体(共用体) :(笔记补充)_第1张图片

 联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)。

由于联合体所有的成员变量的首地址都是相同的,所以使用联合体变量时,一次只能使用其一个成员变量(因为只要我们修改一个联合体成员变量的内容,其他所有成员变量的内容都会被改变)

union Un
{
    int i;
    char c;
};
union Un un;
// 下面输出的结果是一样的吗?
int main ()
{
    printf("%d\n", &(un.i));
    printf("%d\n", &(un.c));
    return 0;   
}

联合体(共用体) :(笔记补充)_第2张图片

union Un
{
    int i;
    char c;
};
union Un un;

int main()
{
    un.i = 0x11223344;          
    un.c = 0x55;
    printf("%x\n", un.i);       分别修改两次成员变量。
    return 0;
}

联合体(共用体) :(笔记补充)_第3张图片

二.相关面试题

用联合体实现一个程序用于判断当前计算机的大小端存储字节序:
 

typedef union Judge
{
    int i;
    char c;
}Judge;
int Sys_Judge(void)
{
    Judge Un = { 0 };
    Un.c = 1;
    return Un.c;
}
int main()
{
    if (1 == Sys_Judge())
    {
        printf("操作系统为小端存储\n");
    }
    else
    {
        printf("操作系统为大端存储\n");
    }
    return 0;
}

联合体(共用体) :(笔记补充)_第4张图片

三.联合体大小计算

1.联合的大小至少是最大成员的大小。
2.当最大成员大小不是该联合体的最大对齐数的整数倍的时候,联合体的总大小要补足到最大对齐数的整数倍(这时联合体内部就会有未被任何成员利用的字节空间)。

(联合体成员的对齐数定义与结构体相同)

比如:

union Un1
{
    char c[5];
    int i;
};
union Un2
{
    short c[7];
    int i;
};
//下面输出的结果是什么?

int main ()
{ 
    printf("%d\n", sizeof(union Un1));
    printf("%d\n", sizeof(union Un2));
    return 0;
} 

联合体(共用体) :(笔记补充)_第5张图片

 

Un2可做类似分析。

联合体(共用体) :(笔记补充)_第6张图片

联合体(共用体) :(笔记补充)_第7张图片

你可能感兴趣的:(初学者日志,c语言,开发语言)