时间:2022-12-31 12:20:05 | 栏目:Android代码 | 点击:次
共用体是一种特殊的数据类型,允许您在相同的内存位置存储不同的数据类型。您可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值。共用体提供了一种使用相同的内存位置的有效方式。
为了定义共用体,您必须使用 union
语句,方式与定义结构类似。union
语句定义了一个新的数据类型,带有多个成员。
union 语句的格式如下:
union [union tag] { member definition; member definition; ... member definition; } [one or more union variables];
union tag
是可选的,每个 member definition
是标准的变量定义,比如 int i
; 或者 float f;
或者其他有效的变量定义。在共用体定义的末尾,最后一个分号之前,您可以指定一个或多个共用体变量,这是可选的。下面定义一个名为 Data 的共用体类型,有三个成员 i、f 和 str:
union Data { int i; float f; char str[20]; } data;
现在,Data
类型的变量可以存储一个整数、一个浮点数,或者一个字符串。这意味着一个变量(相同的内存位置)可以存储多个多种类型的数据。您可以根据需要在一个共用体内使用任何内置的或者用户自定义的数据类型。
例如,在上面的实例中,Data 将占用 20 个字节的内存空间,因为在各个成员中,字符串所占用的空间是最大的。下面的实例将显示上面的共用体占用的总内存大小:
union Data { int i; float f; char str[20]; }; void main( ) { union Data data; printf( "Memory size occupied by data : %d\n", sizeof(data)); system("pause"); }
结果输出:
Memory size occupied by data : 20
union MyValue { int x; int y; double z; }; void main() { union MyValue d1; d1.x = 90; d1.y = 100; //最后一次赋值有效 //d1.z = 23.8; printf("%d , %d, %lf\n", d1.x, d1.y, d1.z); d1.z = 23.8; printf("%d, %d, %lf\n", d1.x, d1.y, d1.z); system("pause"); }
结果输出:
100 , 100, -92559592117433135502616407313071917486139351398276445610442752.000000
-858993459, -858993459, 23.800000
typedef union jvalue { jboolean z; jbyte b; jchar c; jshort s; jint i; jlong j; jfloat f; jdouble d; jobject l; } jvalue;
枚举(列举所有的情况),限定值的取值范围,保证取值的安全性。
enum Day { Monday,//默认为0,后续枚举成员的值在前一个成员上加1 Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }; void main() { //枚举的值,必须是括号中的值 enum Day d = Monday; printf("%#x,%d\n", &d, d); d = Wednesday; printf("%#x,%d\n", &d, d); getchar(); }
结果输出:
0xdaaff5e4,0
0xdaaff5e4,2
#define
的替代。综合举例:
enum Season { spring, summer = 100, fall = 96, winter }; typedef enum { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday } Weekday; void main() { /* Season */ printf("%d \n", spring); // 0 printf("%d, %c \n", summer, summer); // 100, d printf("%d \n", fall + winter); // 193 enum Season mySeason = winter; if (winter == mySeason) printf("mySeason is winter \n"); // mySeason is winter int x = 100; if (x == summer) printf("x is equal to summer\n"); // x is equal to summer printf("%d bytes\n", sizeof(spring)); // 4 bytes /* Weekday */ printf("sizeof Weekday is: %d \n", sizeof(Weekday)); //sizeof Weekday is: 4 Weekday today = Saturday; Weekday tomorrow; if (today == Monday) tomorrow = Tuesday; else tomorrow = (Weekday)(today + 1); //remember to convert from int to Weekday getchar(); }
结果输出:
0
100, d
193
mySeason is winter
x is equal to summer
4 bytes
sizeof Weekday is: 4