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