博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android NDK开发之旅7 C语言 联合体与枚举
阅读量:5907 次
发布时间:2019-06-19

本文共 2981 字,大约阅读时间需要 9 分钟。

###联合体 #####共用体是一种特殊的数据类型,允许您在相同的内存位置存储不同的数据类型。您可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值。共用体提供了一种使用相同的内存位置的有效方式。 ####定义共用体 为了定义共用体,您必须使用 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复制代码

####JNI头文件中的联合体:

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,00xdaaff5e4,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); // 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();}结果输出:0100, d193mySeason is winterx is equal to summer4 bytessizeof Weekday is: 4复制代码

转载地址:http://uecpx.baihongyu.com/

你可能感兴趣的文章
第十六章:数据绑定(三)
查看>>
antiX 17.4 发布,轻量级 Linux 发行版
查看>>
Java高并发秒杀Api-web 层
查看>>
全网互联之高速通道
查看>>
JVM GC杂谈之理论入门
查看>>
byteorder.h学习
查看>>
一线大厂青睐的前端人,90%满足这3个条件
查看>>
PostgreSQL 随机记录返回 - 300倍提速实践 (随机数组下标代替order by random())
查看>>
Confluence 6 配置服务器基础地址备注
查看>>
dql数据权限控制
查看>>
JavaWeb技术内幕一:深入web请求过程
查看>>
压测软件Jmeter使用实例(WIN7环境)
查看>>
Android内存泄漏检测工具:LeakCanary
查看>>
使用ABAP正则表达式解析HTML标签
查看>>
Android--Error:Library projects cannot enable Jack. Jack is enabled in default config
查看>>
左志坚:卖掉拇指阅读,没有什么舍不得
查看>>
SDN&NFV营收大数据分析
查看>>
监督学习最常见的五种算法,你知道几个?
查看>>
隧道高清网络视频传输解决方案
查看>>
《Servlet和JSP学习指南》一1.3 编写基础的Servlet应用程序
查看>>