经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » Android » 查看文章
Android?NDK开发(C语言--联合体与枚举)
来源:jb51  时间:2021/12/9 11:45:46  对本文有异议

1.联合体

共用体是一种特殊的数据类型,允许您在相同的内存位置存储不同的数据类型。您可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值。共用体提供了一种使用相同的内存位置的有效方式。

1.1定义共用体

为了定义共用体,您必须使用 union 语句,方式与定义结构类似。union 语句定义了一个新的数据类型,带有多个成员。

union 语句的格式如下:

  1. union [union tag]
  2. {
  3. member definition;
  4. member definition;
  5. ...
  6. member definition;
  7. } [one or more union variables];
  8.  
  9.  

union tag 是可选的,每个 member definition 是标准的变量定义,比如 int i; 或者 float f; 或者其他有效的变量定义。在共用体定义的末尾,最后一个分号之前,您可以指定一个或多个共用体变量,这是可选的。下面定义一个名为 Data 的共用体类型,有三个成员 i、f 和 str:

  1. union Data
  2. {
  3. int i;
  4. float f;
  5. char str[20];
  6. } data;
  7.  
  8.  

现在,Data 类型的变量可以存储一个整数、一个浮点数,或者一个字符串。这意味着一个变量(相同的内存位置)可以存储多个多种类型的数据。您可以根据需要在一个共用体内使用任何内置的或者用户自定义的数据类型。

1.2共用体占用的内存应足够存储共用体中最大的成员。

例如,在上面的实例中,Data 将占用 20 个字节的内存空间,因为在各个成员中,字符串所占用的空间是最大的。下面的实例将显示上面的共用体占用的总内存大小:

  1. union Data
  2. {
  3. int i;
  4. float f;
  5. char str[20];
  6. };
  7. void main( )
  8. {
  9. union Data data;
  10. printf( "Memory size occupied by data : %d\n", sizeof(data));
  11. system("pause");
  12. }
  13.  
  14.  

结果输出:

Memory size occupied by data : 20

1.3联合变量任何时刻只有一个变量存在,最后一次赋值有效

  1. union MyValue {
  2.  
  3. int x;
  4. int y;
  5. double z;
  6.  
  7. };
  8.  
  9.  
  10.  
  11. void main() {
  12.  
  13. union MyValue d1;
  14.  
  15. d1.x = 90;
  16.  
  17. d1.y = 100; //最后一次赋值有效
  18.  
  19. //d1.z = 23.8;
  20.  
  21. printf("%d , %d, %lf\n", d1.x, d1.y, d1.z);
  22.  
  23. d1.z = 23.8;
  24. printf("%d, %d, %lf\n", d1.x, d1.y, d1.z);
  25.  
  26. system("pause");
  27.  
  28. }
  29.  

结果输出:

100 , 100, -92559592117433135502616407313071917486139351398276445610442752.000000
-858993459, -858993459, 23.800000

1.4JNI头文件中的联合体

  1. typedef union jvalue {
  2. jboolean z;
  3. jbyte b;
  4. jchar c;
  5. jshort s;
  6. jint i;
  7. jlong j;
  8. jfloat f;
  9. jdouble d;
  10. jobject l;
  11. } jvalue;
  12.  
  13.  

2.枚举

枚举(列举所有的情况),限定值的取值范围,保证取值的安全性。

  1. enum Day
  2. {
  3. Monday,//默认为0,后续枚举成员的值在前一个成员上加1
  4. Tuesday,
  5. Wednesday,
  6. Thursday,
  7. Friday,
  8. Saturday,
  9. Sunday
  10. };
  11.  
  12.  
  13. void main() {
  14. //枚举的值,必须是括号中的值
  15. enum Day d = Monday;
  16. printf("%#x,%d\n", &d, d);
  17.  
  18. d = Wednesday;
  19. printf("%#x,%d\n", &d, d);
  20.  
  21. getchar();
  22. }
  23.  

结果输出:

0xdaaff5e4,0
0xdaaff5e4,2

  • (1) 枚举型是一个集合,集合中的元素(枚举成员)是一些命名的整型常量,元素之间用逗号,隔开。
  • (2) DAY是一个标识符,可以看成这个集合的名字,是一个可选项,即是可有可无的项。
  • (3) 第一个枚举成员的默认值为整型的0,后续枚举成员的值在前一个成员上加1。
  • (4) 可以人为设定枚举成员的值,从而自定义某个范围内的整数。
  • (5) 枚举型是预处理指令#define的替代。
  • (6) 类型定义以分号;结束。

综合举例:

  1. enum Season
  2. {
  3. spring, summer = 100, fall = 96, winter
  4. };
  5.  
  6. typedef enum
  7. {
  8. Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
  9. }
  10. Weekday;
  11.  
  12. void main()
  13. {
  14. /* Season */
  15. printf("%d \n", spring); // 0
  16. printf("%d, %c \n", summer, summer); // 100, d
  17. printf("%d \n", fall + winter); // 193
  18. enum Season mySeason = winter;
  19. if (winter == mySeason)
  20. printf("mySeason is winter \n"); // mySeason is winter
  21.  
  22. int x = 100;
  23. if (x == summer)
  24. printf("x is equal to summer\n"); // x is equal to summer
  25.  
  26. printf("%d bytes\n", sizeof(spring)); // 4 bytes
  27.  
  28. /* Weekday */
  29. printf("sizeof Weekday is: %d \n", sizeof(Weekday)); //sizeof Weekday is: 4
  30.  
  31. Weekday today = Saturday;
  32. Weekday tomorrow;
  33. if (today == Monday)
  34. tomorrow = Tuesday;
  35. else
  36. tomorrow = (Weekday)(today + 1); //remember to convert from int to Weekday
  37.  
  38.  
  39. getchar();
  40. }
  41.  

结果输出:

0
100, d
193
mySeason is winter
x is equal to summer
4 bytes
sizeof Weekday is: 4

到此这篇关于Android NDK开发(C语言--联合体与枚举)的文章就介绍到这了,更多相关C语言--联合体与枚举内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号