Android|Android NDK开发(C语言--联合体与枚举)
目录
- 1.联合体
- 1.1定义共用体
- 1.2共用体占用的内存应足够存储共用体中最大的成员。
- 1.3联合变量任何时刻只有一个变量存在,最后一次赋值有效
- 1.4JNI头文件中的联合体
- 2.枚举
1.联合体
【Android|Android NDK开发(C语言--联合体与枚举)】共用体是一种特殊的数据类型,允许您在相同的内存位置存储不同的数据类型。您可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值。共用体提供了一种使用相同的内存位置的有效方式。
1.1定义共用体
为了定义共用体,您必须使用
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; charstr[20]; } data;
现在,
Data
类型的变量可以存储一个整数、一个浮点数,或者一个字符串。这意味着一个变量(相同的内存位置)可以存储多个多种类型的数据。您可以根据需要在一个共用体内使用任何内置的或者用户自定义的数据类型。1.2共用体占用的内存应足够存储共用体中最大的成员。
例如,在上面的实例中,Data 将占用 20 个字节的内存空间,因为在各个成员中,字符串所占用的空间是最大的。下面的实例将显示上面的共用体占用的总内存大小:
union Data{int i; float f; charstr[20]; }; void main( ){union Data data; printf( "Memory size occupied by data : %d\n", sizeof(data)); system("pause"); }
结果输出:
Memory size occupied by data : 20
1.3联合变量任何时刻只有一个变量存在,最后一次赋值有效
unionMyValue {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
1.4JNI头文件中的联合体
typedef union jvalue {jbooleanz; jbyteb; jcharc; jshorts; jinti; jlongj; jfloatf; jdoubled; jobjectl; } jvalue;
2.枚举
枚举(列举所有的情况),限定值的取值范围,保证取值的安全性。
enum Day{Monday,//默认为0,后续枚举成员的值在前一个成员上加1Tuesday,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
- (1) 枚举型是一个集合,集合中的元素(枚举成员)是一些命名的整型常量,元素之间用逗号,隔开。
- (2) DAY是一个标识符,可以看成这个集合的名字,是一个可选项,即是可有可无的项。
- (3) 第一个枚举成员的默认值为整型的0,后续枚举成员的值在前一个成员上加1。
- (4) 可以人为设定枚举成员的值,从而自定义某个范围内的整数。
- (5) 枚举型是预处理指令
#define
的替代。 - (6) 类型定义以分号; 结束。
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); // 0printf("%d, %c \n", summer, summer); // 100, dprintf("%d \n", fall + winter); // 193enum Season mySeason = winter; if (winter == mySeason)printf("mySeason is winter \n"); // mySeason is winterint x = 100; if (x == summer)printf("x is equal to summer\n"); // x is equal to summerprintf("%d bytes\n", sizeof(spring)); // 4 bytes/* Weekday */printf("sizeof Weekday is: %d \n", sizeof(Weekday)); //sizeof Weekday is: 4Weekday today = Saturday; Weekday tomorrow; if (today == Monday)tomorrow = Tuesday; elsetomorrow = (Weekday)(today + 1); //remember to convert from int to Weekdaygetchar(); }
结果输出:
0到此这篇关于Android NDK开发(C语言--联合体与枚举)的文章就介绍到这了,更多相关C语言--联合体与枚举内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
100, d
193
mySeason is winter
x is equal to summer
4 bytes
sizeof Weekday is: 4
推荐阅读
- android第三方框架(五)ButterKnife
- 深入理解Go之generate
- Android中的AES加密-下
- 标签、语法规范、内联框架、超链接、CSS的编写位置、CSS语法、开发工具、块和内联、常用选择器、后代元素选择器、伪类、伪元素。
- 带有Hilt的Android上的依赖注入
- android|android studio中ndk的使用
- Android事件传递源码分析
- RxJava|RxJava 在Android项目中的使用(一)
- Android7.0|Android7.0 第三方应用无法访问私有库
- 深入理解|深入理解 Android 9.0 Crash 机制(二)