联合体和枚举——— 自定义类型

联合体:

在进行某些算法的C语言编程的时候,需要使几种不同类型的变量存放到同一段内存单元中。也就是使用覆盖技术,几个变量互相覆盖。这种几个不同的变量共同占用一段内存的结构,在C语言中,被称作“共用体”类型结构,简称共用体,也叫联合体。

联合体的声名:
union Un//联合类型的声明
{
  char c;//联合体成员
  int i;
};

union Un un;//联合变量的定义

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

  • 联合的大小至少是最大成员的大小。
  • 当前最大成员不是最大对齐数的整数倍时,就要对齐到最大对齐数的整数倍。
#include<stdio.h>

union Un2
{
        char c[5];

        int i;
};

union Un3
{
        short c[7];

        int i;
};

int main()

{
       printf("%d\n", sizeof(union Un2));//8
   //结果是5,不是最大对齐数4的整数倍,补3
       printf("%d\n", sizeof(union Un3));//16
 //结果是12,不是最大对齐数4的整数倍,补2
       system("pause");
       return 0;
}

联合体的运用:
利用联合体的性质来判断计算机存储的大小端存储模式。

#include<stdio.h>

union Un 
{
   char c;
   int i;
};

int main()
{
   union Un un;
   un.i=1;
   if(un.c==1)
   {
      printf("小端存储模式\n";
   }
   else
   {
      printf("大端存储模式\n";
   }
    system("pause");
    return 0;
}

枚举

一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。这两种类型经常(但不总是)重叠。枚举在日常生活中很常见,例如表示星期的SUNDAY、MONDAY、TUESDAY、WEDNESDAY、THURSDAY、FRIDAY、SATURDAY就是一个枚举。
枚举的声名和枚举变量的赋值:

enum Num//枚举类型 Num枚举名
{

    x1=-2,
    x2,
    x3=50,
    x4
}x;//枚举变量

int main()
{
	enum Num a,b,c,d;//枚举变量
	a = x1; //-2
	b = x2; //-1
	c = x3; //50
	d = x4; //21
	printf("%d\n%d\n%d\n%d\n", a, b, c, d);
	system("pause");
	return 0;
}

注意:

  • 如果枚举没有初始化,即省掉"=整型常数"时, 则从第一个标识符开始,顺次赋给标识符0, 1, 2, …。但当枚举中的某个成员赋值后,其后的成员按依次加1的规则确定其值。
  • 枚举中每个成员(标识符)结束符是"," 不是";", 最后一个成员可省略","。
  • 初始化时可以赋负数, 以后的标识符仍依次加1。
  • 枚举变量只能取枚举说明结构中的某个标识符常量。
  • .枚举值是常量,不是变量。不能在程序中用赋值语句再对它赋值。
  • 只能把枚举值赋予枚举变量,不能把元素的数值直接赋予枚举变量。
    枚举的优点:
  • 增加代码的可读性和可维护性。
  • 和#define定义的标识符比较枚举有类型检查,严谨。
  • 防止了命名污染(封装)。
  • 便于调试。
  • 使用方便,一次定义多个常量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值