C语言C位出道心法(三):共用体|枚举


C语言C位出道心法(一):基础语法

C语言C位出道心法(二):结构体|结构体指针|链表

C语言C位出道心法(三):共用体|枚举

 C语言C位出道心法(四):文件操作





一: C语言共用体数据类型认知 


 结构体数据类型认知:
     (1)共用体是一种构造类型,而枚举是一种基本数据类型;
     (2)结构体定义了一个由多个数据成员组成的特殊类型,而在节约空间方面来看,C语言提供了一种有若干数据类型组成的却又
     共享同一内存空间的构造类型;这种构造类型是"共用体"。共用体看起来像结构体,只不过关键字有struct变为union;
     (3)共用体声明一般形式为:
          union 共用体名称 {
              数据类型1 成员名表1;
              数据类型2 成员名表2;
              数据类型3 成员名表3;
              ....................
              ....................
              数据类型n 成员名表n;
          }; // 结尾的分号不能少;
     (4)共用体也称为"联合体",它使不同类型的成员存放到同一段内存空间中,所有同一时刻共用体只有一个值,它属于共用体中的某一个成员;
     由于共用体的所有成员位于同一段内存空间,因此共用体所占内存的大小就等于最大成员的大小;

     (5)定义共用体变量通常有三种方式
          5.1: 先申明共用体类型,再定义共用体变量
          union 共用体名{
             成员列表;
          };
          union 共用体名 变量名列表;
          5.2: 声明共用体类型的同时定义共用体变量
          union 共用体名 {
             成员列表;
          }变量名列表;
          5.3 匿名定义共用体
          union {
            成员列表;
          }共用体名列表;

      (6)共用体成员的引用
           共用体成员的引用与结构体成员引用类似,大致分为两种:
           6.1 使用点运算符(或者称为成员引用符)
           共用体变量名.成员名;
           或者引用共用体指针的形式: (*指针变量名).成员名;
           6.2 使用指向运算符
           指向共用体变量的指针->成员名;
      (7)提示: 不能使用直接引用共用体变量,如: "printf("%d",variable);"的写法是错误的;

             


1.1  实例一: 共用体申明与定义,引用 
#define _CRT_SECURE_NO_WARNINGS
#include <string.h>
#include <stdio.h>

/*
   结构体数据类型认知:
       (1)共用体是一种构造类型,而枚举是一种基本数据类型;
       (2)结构体定义了一个由多个数据成员组成的特殊类型,而在节约空间方面来看,C语言提供了一种有若干数据类型组成的却又
       共享同一内存空间的构造类型;这种构造类型是"共用体"。共用体看起来像结构体,只不过关键字有struct变为union;
       (3)共用体声明一般形式为:
            union 共用体名称 {
                数据类型1 成员名表1;
                数据类型2 成员名表2;
                数据类型3 成员名表3;
                ....................
                ....................
                数据类型n 成员名表n;
            }; // 结尾的分号不能少;
       (4)共用体也称为"联合体",它使不同类型的成员存放到同一段内存空间中,所有同一时刻共用体只有一个值,它属于共用体中的某一个成员;
       由于共用体的所有成员位于同一段内存空间,因此共用体所占内存的大小就等于最大成员的大小;

       (5)定义共用体变量通常有三种方式
            5.1: 先申明共用体类型,再定义共用体变量
            union 共用体名{
               成员列表;
            };
            union 共用体名 变量名列表;
            5.2: 声明共用体类型的同时定义共用体变量
            union 共用体名 {
               成员列表;
            }变量名列表;
            5.3 匿名定义共用体
            union {
              成员列表;
            }共用体名列表;

        (6)共用体成员的引用
             共用体成员的引用与结构体成员引用类似,大致分为两种:
             6.1 使用点运算符(或者称为成员引用符)
             共用体变量名.成员名;
             或者引用共用体指针的形式: (*指针变量名).成员名;
             6.2 使用指向运算符
             指向共用体变量的指针->成员名;
        (7)提示: 不能使用直接引用共用体变量,如: "printf("%d",variable);"的写法是错误的;
             
           
*/
// 定义一个罐头的共用体,成员为各种水果结构体
// 声明蟠桃的结构体
struct peaches {
    char name[64];
};

// 声明椰子的结构体
struct coconut {
    char name[64];
};

// 申明山楂结构体
struct hawthorn {
    char name[40];
};

// 声明罐头共用体
union tin {
    struct peaches p;
    struct coconut c;
    struct hawthorn h;
};
int main() {
    // 定义共用体变量
    union tin t;
    strcpy(t.p.name, "桃子");
    strcpy(t.c.name, "椰子");
    strcpy(t.h.name, "山楂");

    printf("这个罐头瓶装有: %s\n", t.p.name);
    printf("这个罐头瓶装有: %s\n", t.c.name);
    return 0;
}

运行效果:


这个罐头瓶装有: 山楂
这个罐头瓶装有: 山楂

D:\program_file\C++_workspace\ProjectToCustomerDataTypeUnion\x64\Debug\ProjectToCustomerDataTypeUnion.exe (进程 6640)已 退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .


 


1.2 实例二: 共用体指针引用 

共用体特性:
    (1)同一个内存段可以用来存放不同类型的成员,但是每一次只能存放其中的一种,而不是同时存放所有的成员。
 也就是说,在共用体中,同一时间只有一个成员作用,其他成员不起左右;
 (2)共用体变量中起作用的成员是最后一次放入的成员,在存入一个新的成员后原有的成员就失去了作用;
 (3)共用体变量的地址和它的成员的地址是一样的;
 (4)不能对共用体变量名赋值,也不能通过引用变量名来得到一个值。
 (5)共用体变量所占的内存长度等于共用体中最长的成员的长度; 


#define _CRT_SECURE_NO_WARINGS
#include "stdio.h"
#include <string.h>
/*
   共用体特性:
       (1)同一个内存段可以用来存放不同类型的成员,但是每一次只能存放其中的一种,而不是同时存放所有的成员。
	   也就是说,在共用体中,同一时间只有一个成员作用,其他成员不起左右;
	   (2)共用体变量中起作用的成员是最后一次放入的成员,在存入一个新的成员后原有的成员就失去了作用;
	   (3)共用体变量的地址和它的成员的地址是一样的;
	   (4)不能对共用体变量名赋值,也不能通过引用变量名来得到一个值。
	   (5)共用体变量所占的内存长度等于共用体中最长的成员的长度;
*/
// 声明季节的共用体
union Season {
	char name[20];
}season;

int main() {
	union Season* s; // 定义结构体类型的指针
	s = &season; // 指针指向共用体变量
	strcpy(s->name, "夏季"); // 将字符串常量复制到成员变量中
	printf("现在是%s\n",s->name);
	return 0;
}

运行效果:


现在是夏季

D:\program_file\C++_workspace\ProjectToCodeUnion\x64\Debug\ProjectToCodeUnion.exe (进程 7500)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
 


二:C语言枚举基本数据类型认知


C语言中枚举类型认知升维:
   (1)在实际编程中,有一些变量的取值被限定在一个有限的范围内。如一年有12个月,一个礼拜有7天,1一天有24小时,一年有4个季节等等;
在C语言中,提供了枚举来表示这样的类型,在枚举类型的定义中列举出所有可能的取值,被说明为该枚举变量的取值不能操过定义的范围。
C语言中枚举是一种基本数据类型,而不是自定义数据类型;因此它不能被分解为任何基本数据类型;
(2)枚举类型申明
    enum 枚举名{枚举值列表}; // 别忘记末尾的";"分号;
    2.1 enum是声明枚举的关键字
 2.2 "枚举名"是用户定义的标识符
 2.3 "枚举值列表" 需要在大括号内罗列出所有可用值;这些值也被称为"枚举元素",每个枚举元素用逗号分隔开;
 2.4 大括号"{}"后的分号";"不能省略;
 2.5 枚举元素中字符不需要使用单引号,字符串不需要使用双引号;
 (3)枚举类型变量的定义
        枚举类型变量的定义和结构体,共用体变量定义类似,通常用两种定义方式;
  3.1 先声明枚举类型,再定义枚举变量
  enum 枚举名 变量名;
  例如: enum Season {spring,summer,autumn,winter};
        enum Season a,b,c;
  3.2 声明枚举类型的同时定义枚举变量;
  enum 枚举名{枚举值列表} 变量名;
  例如: enum Season {spring,summer,autumn,winter} a,b,c;
 (4)枚举变量的赋值与使用
      4.1 枚举类型变量的使用
    枚举是常量,不是变量,不能在程序中用赋值语句在对它赋值;
    spring = 5;
    summer = 2;
    winter = 0; // 枚举元素不能这样赋值;
4.2 枚举类型的赋值,系统会自动给枚举元素对应一个表示序号的整数值,从0开始顺序定义为0,1,2......;
例如上面定义的枚举Season枚举,枚举元素spring的值是0,summer的值是1,autumn的值是2;
4.3 只能把枚举值赋值给枚举类型的变量,不能把元素的数值直接赋予枚举类型的变量; 加入a,b是Season枚举类型的变量,则下面的赋值表达式;
a = spring;
b = summer; // 这样是正确的;
而: a,b = 0,1; 这是错误的
如果一定要把数值赋值给枚举类型的变量,就需要强制类型转换;
a = (enum Season)0;
其意义是将顺序为0的枚举值赋予枚举型的变量a;相当于;
a = spring;
4.4 可以将枚举元素赋值给一个整形变量;
int i = spring;
int j = summer;


#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
/*
   C语言中枚举类型认知升维:
      (1)在实际编程中,有一些变量的取值被限定在一个有限的范围内。如一年有12个月,一个礼拜有7天,1一天有24小时,一年有4个季节等等;
	  在C语言中,提供了枚举来表示这样的类型,在枚举类型的定义中列举出所有可能的取值,被说明为该枚举变量的取值不能操过定义的范围。
	  C语言中枚举是一种基本数据类型,而不是自定义数据类型;因此它不能被分解为任何基本数据类型;
	  (2)枚举类型申明
	      enum 枚举名{枚举值列表}; // 别忘记末尾的";"分号;
	      2.1 enum是声明枚举的关键字
		  2.2 "枚举名"是用户定义的标识符
		  2.3 "枚举值列表" 需要在大括号内罗列出所有可用值;这些值也被称为"枚举元素",每个枚举元素用逗号分隔开;
		  2.4 大括号"{}"后的分号";"不能省略;
		  2.5 枚举元素中字符不需要使用单引号,字符串不需要使用双引号;
	   (3)枚举类型变量的定义
	          枚举类型变量的定义和结构体,共用体变量定义类似,通常用两种定义方式;
			  3.1 先声明枚举类型,再定义枚举变量
			  enum 枚举名 变量名;
			  例如: enum Season {spring,summer,autumn,winter};
			        enum Season a,b,c;
			  3.2 声明枚举类型的同时定义枚举变量;
			  enum 枚举名{枚举值列表} 变量名;
			  例如: enum Season {spring,summer,autumn,winter} a,b,c;
	   (4)枚举变量的赋值与使用
	        4.1 枚举类型变量的使用
			    枚举是常量,不是变量,不能在程序中用赋值语句在对它赋值;
				spring = 5;
				summer = 2;
				winter = 0; // 枚举元素不能这样赋值;
			4.2 枚举类型的赋值,系统会自动给枚举元素对应一个表示序号的整数值,从0开始顺序定义为0,1,2......;
			例如上面定义的枚举Season枚举,枚举元素spring的值是0,summer的值是1,autumn的值是2;
			4.3 只能把枚举值赋值给枚举类型的变量,不能把元素的数值直接赋予枚举类型的变量; 加入a,b是Season枚举类型的变量,则下面的赋值表达式;
			a = spring;
			b = summer; // 这样是正确的;
			而: a,b = 0,1; 这是错误的
			如果一定要把数值赋值给枚举类型的变量,就需要强制类型转换;
			a = (enum Season)0;
			其意义是将顺序为0的枚举值赋予枚举型的变量a;相当于;
			a = spring;
			4.4 可以将枚举元素赋值给一个整形变量;
			int i = spring;
			int j = summer;
			    

	      
*/

// 定义枚举类型的为Color的变量color;
enum Color {Red=1,Blue,Green} color;
int main() {
	int icolor;
	printf("请输入0,1,2中三个数中的一个数字:\n");
	scanf("%d", &icolor); // 输入数据
	switch (icolor) {
	case Red:
		printf("the choice is Red\n");
		break;
	case Blue:
		printf("the choice is Blue\n");
		break;
	case Green:
		printf("the choice is Green\n");
		break;
	default:
		printf("???\n");
		break;
	}
	return 0;
}

请输入0,1,2中三个数中的一个数字:
1
the choice is Red

D:\program_file\C++_workspace\ProjectToEnumeric\x64\Debug\ProjectToEnumeric.exe (进程 12264)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值