C语言 共用体

//共用体  union
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

// union  共用体,构造数据类型,也叫联合体,用途:十几个不同类型的变量共占一段内存(相互覆盖)

//共用体在类型定义的时候并不分配内存,定义共用体变量的时候才分配内存
union data{
    char c;
    int a[10];
}udat1;

union stu{
    int a;//内部变量无法初始化,因为类型定义不会分配内存
    char name[10];
}fisr, *fisr1, fisr2[10];//共用体定义形式①
//注意:在定义共用体变量的时候初始化也只能初始化第一个成员变量,无法对其他成员变量初始化

//匿名公共体--匿名共用体无法定义变量,只能在初始化的时候定义变量
//这样就限定了共用体变量的个数,一般用于给某些特殊权限的人使用的变量
union {
    char c;
    int a[10];
}lastp;


struct tes{
    int num;
    char name[40];
}tes1 = {4,"feiyu"},tes2;

//共用体变量占据的内存单元的个数应大于或者等于是其内部最大数据成员占据内存单元数。
//结构体,共用体在内存中存储,字节对齐
//data是共用体,共用体大小必须至少包含最大的成员数据,所以其原始大小是sizeof(int)*10 = 40字节,
//union {
//    char c; 
//    int a[10];
//};
//因为data其原始大小正好是最宽基本类型成员int的倍数,不用填充字节
//所以共用体data的大小是40

//stu是共用体,stu的原始大小是sizeof(char)*10字节,根据字节对齐原则,最宽基本类型成员是int,需要填充字节
//所以共用体stu的大小是12

//总结:共用体大小必须至少包含最大的成员数据,并且可以整除最宽基本类型成员--详情见结构体
void main(){
    //验证共用体的字节对齐原则
    printf("验证共用体的字节对齐原则--%d\n", sizeof(udat1));
    printf("验证共用体的字节对齐原则--%d\n", sizeof(fisr));
    //定义共用体
    union stu stuinfo;//共用体定义形式②
    //共用体的赋值
    stuinfo.a = 40;
    //共用体变量任何时候只有一个成员存在,当存在一个成员,却给给其他成员赋值的时候,后面会覆盖前面
    //因为共用体是共占一段内存,不会给每个成员变量都分配一块内存
    strcpy(stuinfo.name, "联想");
    printf("共用体成员变量a=%d;name=%s\n", stuinfo.a, stuinfo.name);
    //结果发现成员变量a被覆盖了
    union stu stuinfo2 = stuinfo;//共用体变量可以直接赋值
    printf("共用体成员变量a=%d;name=%s\n", stuinfo2.a, stuinfo2.name);
    tes2 = tes1;//结构体变量可以直接赋值
    printf("结构体成员变量num=%d,name=%s\n", tes2.num, tes2.name);
    system("pause");
}

 

posted on 2016-03-07 15:04  寒魔影  阅读(668)  评论(0编辑  收藏  举报

导航