C语言共用体Union

2021-02-09  本文已影响0人  YanZi_33

共用体是一种特殊的数据类型,允许你在相同的内存位置存储不同的数据类型。您可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值。

共用体Union的定义

union 共用体名
{
成员列表
};

union Data
{
    int a;
    float b;
    char str[20];
};

共用体Union变量的声明

union Data
{
    int a;
    float b;
    char str[20];
}data;

上面声明了一个共用体变量data;是一个全局的共用体变量。

union Data
{
    int a;
    float b;
    char str[20];
};

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        //共用体变量data1
        union Data data1;
        //共用体变量data2
        union Data data2;
        
    }
    return 0;
}

共用体Union变量的初始化

union Data
{
    int a;
    float b;
    char str[20];
};

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        union Data data2;
        data2.a = 10;
        data2.b = 12.3f;
        strcpy(data2.str,"liyanyan");

    }
    return 0;
}

共用体Union变量访问数据成员

结构体变量名.成员名

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        union Data data2;
        data2.a = 10;
        data2.b = 12.3f;
        strcpy(data2.str,"liyanyan");

        printf(" a = %d",data2.a);
        printf(" b = %f",data2.b);
        printf(" str = %s",data2.str);
        
    }
    return 0;
}

共用体Union变量的内存大小

union Data
{
    int a;
    float b;
    char str[3];
};

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        union Data data2;
        data2.a = 10;
        data2.b = 12.3f;
        strcpy(data2.str,"li");
        
        NSLog(@" size = %lu",sizeof(data2)); //size = 4
    }
    return 0;
}

上面的共用体变量data2所占内存大小为4个字节,最大的数据成员为float b.

union Data
{
    int a;
    float b;
    char str[20];
};

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        union Data data2;
        data2.a = 10;
        data2.b = 12.3f;
        strcpy(data2.str,"li");
        
        NSLog(@" size = %lu",sizeof(data2)); //size = 20
    }
    return 0;
}

上面的共用体变量data2所占内存大小为20个字节,最大的数据成员为char str[20].

共用体Union变量所占内存

联合体是由不同的数据类型组成,但其变量是互斥的,所有的成员共占一段内存。而且共用体采用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会将原来成员的值覆盖掉。
缺点:包容性弱
优点:所有成员共用一段内存,使内存的使用更为精细灵活,同时也节省了内存空间。

上一篇 下一篇

猜你喜欢

热点阅读