Android NDK开发(C语言--联合体与枚举)

 更新时间:2021年12月09日 10:23:41   作者:冬日毛毛雨  
这篇文章主要介绍了Android NDK开发C语言联合体与枚举,共用体是一种特殊的数据类型,允许您在相同的内存位置存储不同的数据类型。您可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值。下面详细介绍该内容,需要的朋友可以参考一下

1.联合体

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

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;
   char  str[20];
} data;


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

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

例如,在上面的实例中,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

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

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

1.4JNI头文件中的联合体

typedef union jvalue {
    jboolean    z;
    jbyte       b;
    jchar       c;
    jshort      s;
    jint        i;
    jlong       j;
    jfloat      f;
    jdouble     d;
    jobject     l;
} jvalue;


2.枚举

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

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

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

相关文章

  • 使用SharedPreferences在Android存储对象详细代码

    使用SharedPreferences在Android存储对象详细代码

    这篇文章主要介绍了使用SharedPreferences在Android存储对象并附上详细代码,下面文章内容较少,大多以代码的形式体现,需要的小伙伴可以参考一下,希望对你有所帮助
    2021-11-11
  • Android APP数字解锁实例详解

    Android APP数字解锁实例详解

    这篇文章主要介绍了Android 应用数字解锁实例详解的相关资料,这里附有实例代码及实现效果图,需要的朋友可以参考下
    2016-11-11
  • Android zxing如何识别反转二维码详解

    Android zxing如何识别反转二维码详解

    这篇文章主要给大家介绍了关于Android zxing如何识别反转二维码的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-09-09
  • Android 中ScrollView与ListView冲突问题的解决办法

    Android 中ScrollView与ListView冲突问题的解决办法

    这篇文章主要介绍了Android 中ScrollView与ListView冲突问题的解决办法的相关资料,希望通过本文能帮助到大家,让大家掌握解决问题的办法,需要的朋友可以参考下
    2017-10-10
  • Android Studio模拟器运行apk文件

    Android Studio模拟器运行apk文件

    这篇文章主要介绍了Android Studio模拟器运行apk文件,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的小伙伴可以参考一下
    2022-09-09
  • Android之ListView分页加载数据功能实现代码

    Android之ListView分页加载数据功能实现代码

    这篇文章主要为大家详细介绍了Android之ListView分页加载数据功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • Android滚动菜单ListView实例详解

    Android滚动菜单ListView实例详解

    这篇文章主要为大家详细介绍了Android滚动菜单ListView实例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • 分享一个Android设置圆形图片的特别方法

    分享一个Android设置圆形图片的特别方法

    圆形图片想必是项目开发中也是不少用的一个知识点吧。那么这里学习一下简单的制作圆形图片,这个方法不用于平时的实现方法,有需要的可以参考借鉴。
    2016-09-09
  • Android基于ViewPager+Fragment实现左右滑屏效果的方法

    Android基于ViewPager+Fragment实现左右滑屏效果的方法

    这篇文章主要介绍了Android基于ViewPager+Fragment实现左右滑屏效果的方法,结合实例形式分析了Android实现滑屏效果的布局与滑动功能相关操作技巧,需要的朋友可以参考下
    2017-07-07
  • Android 如何使用短信链接打开APP

    Android 如何使用短信链接打开APP

    这篇文章主要介绍了Android 如何使用短信链接打开APP,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03

最新评论