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

182 阅读3分钟

联合体

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

定义共用体

为了定义共用体,您必须使用 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