15.C基础_共用体、枚举

共用体

1、概述与定义

什么是共用体:

共用体又称联合体,是不同数据类型的数据可以使用共同的存储区域。因此同一时间下,只能访问一个共用体的成员,因为它们的空间同一个地方的。

共用体的定义:

共用体的定义与使用与结构体的定义完全一致,唯一的区别是内存大小分配不同

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

共用体变量的定义:

共用体变量的定义与结构体变量的第一完全一致。

//方法1:正常定义结构体变量
union 共用体名 共用体变量名;

//方法2:定义共用体时,定义共用体变量
union 共用体名{
    共用体成员列表
}变量名1,变量名2; //直接在这里写变量名,变量名之间用,隔开               

2、初始化共用体

一般情况初始化:

共用体中虽然成员有多个,但因为它们的空间一样,所以实际赋值是只需要赋值一个

//1.定义共用体变量时初始化
union 共用体名 共用体变量名 = {一个值};

//2.定义共用体时,定义共用体变量的初始化
struct 共用体名{
    共用体成员列表
}变量名 = {一个值};

初始化共用体中的结构体:

这时的初始化类似结构体变量的部分初始化,指定某一个变量,然后初始化。但同样的,只能初始化一个值。

union 共用体名 共用体变量名 = {
    .成员 = 值
};

3、访问共用体变量

共用体变量的访问方法与结构体变量的访问方法完全一致。

访问共用体变量时,应该遵循赋值谁,就访问谁。尽管共用体成员的空间是一样的,强行访问也不会报错,但是逻辑上会有一些问题。

4、共用体大小

计算原则:

  • 要能够容纳的下最大的数据
  • 要是数据类型大小的整数倍,不是则需要补齐

举例:现在有一个共用体定义如下,计算它的大小。

union uTest{
    double a;
    int b;
    char c;
    char d[9];
}

 在这个共用体中,所需空间最大的是d,空间为9字节。占用空间最大的类型是double,空间为8字节。因为9不能被8整除,所以补齐到16。因此该共用体的大小为16。

5、成员相同空间验证

5.1 空间覆盖问题

 实验代码如下:

#include <stdio.h>

int main() {
    union Data {
        struct {
            int x;
            int y;
        } s;
        int x;
        long long y;
    } d;
    d.x = 1;
    printf("d.x  :%x %x\n",&d.x,d.x);
    printf("d.y  :%x %llx\n",&d.y,d.y);
    printf("d.s.x:%x %x\n",&d.s.x,d.s.x);
	printf("d.s.y:%x %x\n",&d.s.y,*(&d.s.y));
	puts(""); 
	d.y = 0x12345678ffffffff;
	printf("d.x  :%x %x\n",&d.x,d.x);
	printf("d.y  :%x %llx\n",&d.y,d.y);
    printf("d.s.x:%x %x\n",&d.s.x,d.s.x);
	printf("d.s.y:%x %x\n",&d.s.y,*(&d.s.y));
	

    return 0;
}

运行结果如下:

5.2 内存值相同,不是数字相同 

实验代码如下:

#include <stdio.h>

int main() {
   union dt {
    int a;
    char b;
    double c;
	} data;
	
	data.a=5;
	printf("%f\n",data.c);

    return 0;
}

运行结果如下: 

printf函数只是将内存中的数据以不同的类型输出,而不能将内存中的整型数据自动转换为等值的浮点数。在内存中,实数与整数的存放形式完全不一样,共用体的成员共用的是同一块内存,而不是同一个数值

枚举

1、定义

枚举类型的定义与结构体一样。成员需要用" , "隔开

enum 枚举名{
    枚举成员列表
};

在定义时,新的枚举的成员名与其他枚举的成员名有重复

2、枚举的赋值与打印值

赋值枚举变量只能赋值枚举中列出的值。

枚举变量的打印值并不是枚举出来的值,而是从0开始的整型(在未进行初始化情况下)

如果枚举定义时,进行了指定值,那么实际值将会从指定值开始。

在赋值时,枚举的成员的赋值可以一样。  

3、枚举大小

枚举的值实际上是一个整型,所以不论枚举成员有多少个,枚举大小都是4字节

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值