联合和枚举

联合

  Q:联合是什么?
  A:联合(union) 是一种数据类型,它可以在同一内存空间中存储不同的数据类型(不是同时存储)。

  PS:结构是可以同时存储不同数据类型的,但联合不可以,只能存储某一个数据类型。

  关键字:union。

联合的声明

  联合的声明和结构声明类似,使用 union 关键字进行声明。

union hold {
	int digit;
	double bigfl;
	char letter;
};

  hold 是联合的标记,之后可以使用 hold 声明一个联合变量。

union hold var1;// hold 类型的联合变量 var1

  也可以在声明联合模板的时候创建一个联合变量。

union hold {
	int digit;
	double bigfl;
	char letter;
} var2;

  联合变量的内存空间:联和模板中占用空间最大的类型的内存大小。如,上例中的 int、double、char 中 double 的内存大小最大,8 字节,所以 union hold 变量的内存空间是 8 字节。

联合的使用

  使用点运算符表示正在使用哪种数据类型。在联合中,一次只能存储一个值。即使有足够的空间,也不能同时存储两个类型的值。

fit.digit = 23; // 把23存储在fit中,占2字节
fit.bigfl = 2.0; // 清除23,存储2.0,占8字节
fit.letter = 'h'; // 清除2.0,存储h,占1字节

练习

#include<stdio.h>
#include<stdlib.h>
union {
     struct {int x, y;} s;
     int x, y;
 } u;
int main()
{
    printf("addr:&u.x=%p, &u.y=%p, &u.s.x=%p, &u.s.y=%p\n\n", &u.x, &u.y, &u.s.x, &u.s.y);
    u.x = 1;
    printf("val:u.x=1;\nres:u.x=%d, u.y=%d, u.s.x=%d, u.s.y=%d\n\n", u.x, u.y, u.s.x, u.s.y);
    u.y = 2;
    printf("val:u.y=2;\nres:u.x=%d, u.y=%d, u.s.x=%d, u.s.y=%d\n\n", u.x, u.y, u.s.x, u.s.y);
    u.s.x = u.x * u.x;
    printf("val:u.s.x = u.x * u.x;\nres:u.x=%d, u.y=%d, u.s.x=%d, u.s.y=%d\n\n", u.x, u.y, u.s.x, u.s.y);
    u.s.y = u.y + u.y;
    printf("val:u.s.y = u.y + u.y;\nres:u.x=%d, u.y=%d, u.s.x=%d, u.s.y=%d\n\n", u.x, u.y, u.s.x, u.s.y);
    getchar();
    return 0;
}

在这里插入图片描述

枚举

  Q:枚举是什么?
  A:枚举类型声明符号名称来表示整型常量。
  关键字: enum。

  简单来说,枚举就是声明了一个符号名称来作为整型常量使用,它将一些整型常量用有意义的字符来表示,本质上依旧是使用整型常量,只是更易于阅读代码。
  枚举类型的目的也就是提高程序的可读性。

枚举的声明

  枚举的声明和结构、联合的声明语法类似。如下列声明创建了 color 作为标记名,允许将 enum color 作为一个类型名使用。

enum color {
	red,
	orange,
	yellow,
	green,
	blue
};

  花括号中的标识符列举了 enum color 变量可能的值。因此 enum color 类型的变量的值可能是 red、orange、yellow…
  那么 red、orange、yellow… 又代表什么值呢?

枚举的值

默认值

  默认情况下,枚举列表中的常量会被赋予0、1、2…,从0开始依次递增。

enum color {
	red,
	orange,
	yellow,
	green,
	blue
};

  例如,上面的例子实际上就是默认 red 代表 0,orange 代表 1,yellow 代表 2,green 代表 3,blue 代表 4。

赋值

  在枚举声明中除了使用默认值,我们还可以指定整数值。如果只给一个枚举常量赋值,没有对后面的枚举常量赋值,那么后面的常量会被赋予后序的值。

enum color {
	red,
	orange = 10,
	yellow,
	green = 20,
	blue
};

  在声明的声明中,red 代表 0,orange 代表 10,yellow 代表 11,green 代表 20, blue 代表 21。

  虽然这样语法上也是 OK 的,但是推荐使用枚举的时候,每个枚举常量都进行显式的赋值。

名称空间

  C 语言通过名称空间标识程序中的各部分,即通过名称来标识。作用域是名称空间概念的一部分:两个不同作用域的同名变量不冲突。

  名称空间是分类别的,在特定作用域中的结构标记、联合标记、枚举标记共享相同的名称空间,但是该名称空间和普通变量使用的名称空间不同。 这表示相同作用域中的变量和标记的名称可以相同,并不会引起冲突。

  PS:在 C++ 中不允许这样做,因为它把标记名和变量名放在同一名称空间中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值