Android NDK开发之旅7 C语言 联合体与枚举

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

复制代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值