Android For JNI(五)——C语言多级指针,结构体,联合体,枚举,自定义类型

简介: <div class="markdown_views"><h1 id="android-for-jni五c语言多级指针结构体联合体枚举自定义类型">Android For JNI(五)——C语言多级指针,结构体,联合体,枚举,自定义类型</h1><hr><blockquote> <p>我们的C已经渐渐的步入正轨了,基础过去之后,就是我们的NDK和JNI实战了</p>

Android For JNI(五)——C语言多级指针,结构体,联合体,枚举,自定义类型


我们的C已经渐渐的步入正轨了,基础过去之后,就是我们的NDK和JNI实战了

一.多级指针

指针的概念我们在前面也讲了许多,也提到了多级指针的概念,那具体我们怎么去操作呢

#include <stdio.h>    
#include <stdlib.h>   

main(){             

       int i = 3;
       //一级 
       int* p = &i;

       //二级,保存一级指针 
       int** w = &p;

       //三级 保存二级指针 
       int*** e = &w; 

       printf("%d\n",*(*w)); 
       printf("%d\n",***e); 
        //让窗口停留 
        int age ; 
        scanf("%d",&age);

   }



其实就是保存多级的指针

这里写图片描述

二.结构体

我们android中常用的实体类在C中就叫结构体,那具体怎么去使用呢,要知道C是没有new的

#include <stdio.h>    
#include <stdlib.h>   

struct student{

       int age;
       char sex;
};

main(){             

       //定义结构体 
      struct student stu = {20,170,'g'}; 

       printf("%d\n",stu.age);
       printf("%d\n",sizeof(stu));

        //让窗口停留 
        int age ; 
        scanf("%d",&age);

   }



大家都有JAVA基础,看这些应该是没有压力的,我们不会特别详细的赘述,那样也毫无意义,我们能看懂代码就差不多了

这里写图片描述

这里打印的长度也是因为有两个int的关系,所以是8

结构体函数指针

我们在结构体中写个函数,试试什么效果?

这里写图片描述

我们会发现不行,原因是因为结构体中不能定义函数,但是我们却需要这样做,C也给出了解决办法,结构体虽然不能定义函数但是可以定义函数指针

#include <stdio.h>    
#include <stdlib.h>   

void study(){
      printf("结构体函数\n");  
}

struct student{

       int age;
       char sex;

       void (*studentp)();
};

main(){             

       //定义结构体 
      struct student stu = {20,170,'g', study }; 

      // printf("%d\n",stu.age);
      // printf("%d\n",sizeof(stu));

       stu.studentp();

        //让窗口停留 
        int age ; 
        scanf("%d",&age);

   }



这样我们就可以调用了,不过开发中,我们一般也不这样写,我们这样写

       struct student* stup = &stu;
       (*stup).study();
       //引用这个指针的属性 
       stup->study();

三.联合体

其实就是一个类型集合一样,我们看‘

#include <stdio.h>    
#include <stdlib.h>   

main(){ 
    //定义联合体
    union{int i ; short j ;char k}un;   
    //他跟结构体的用法类似
     un.i = 30;
     printf("%d\n",un.i); 
     //打印长度
      printf("%d\n",sizeof(un)); 


        //让窗口停留 
        int age ; 
        scanf("%d",&age);

}



打印的结果

这里写图片描述

这里,数据是30没错,这个4是什么?联合体的长度是由最长的决定的,这就是答案了,但是,这就是联合体?NO。我们继续看

#include <stdio.h>    
#include <stdlib.h>   

main(){ 
    //定义联合体
    union{int i ; short j ;char k}un;   
    //他跟结构体的用法类似
     un.i = 30;
     printf("%d\n",un.i); 
     un.j = 20;
         printf("%d\n",un.i); 
     //打印长度
      printf("%d\n",sizeof(un)); 


        //让窗口停留 
        int age ; 
        scanf("%d",&age);

}



我们看结果

这里写图片描述

i = 20了,那是因为联合体每次只能存放一个数据,有值的话就替换

四.枚举

语法都有点类似,JAVA有枚举,C也有,而且都是同样的作用,你JAVA会了,C也就会了,我们来稍微概括一下就可以了

#include <stdio.h>    
#include <stdlib.h>  

enum WeekDay
{
Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday
};

int main(void)
{
  //int day;
  enum WeekDay day = Sunday;
  printf("%d\n",day);
  system("pause");
  return 0;
}

我们打印出来是6,从0开始的

五.自定义类型

我们C中没有布尔,其实可以自定义的

#include <stdio.h>    
#include <stdlib.h>   
//自定义类型 
typedef int hello;

main(){ 

    hello i = 3;
    printf("%d\n",i);


     //让窗口停留 
     int age ; 
     scanf("%d",&age);

}

这个例子完全就是定义int,我们下篇就会讲到,我们的NDK开发,我们这里就不讲的那么详细,我们说NDK的时候尽量详细点

这篇先到这里,C的基本东东我们了解一下就可以了,下节课我们就回到我们的android来

目录
相关文章
|
存储 网络协议 编译器
【C语言】深入解析C语言结构体:定义、声明与高级应用实践
通过根据需求合理选择结构体定义和声明的放置位置,并灵活结合动态内存分配、内存优化和数据结构设计,可以显著提高代码的可维护性和运行效率。在实际开发中,建议遵循以下原则: - **模块化设计**:尽可能封装实现细节,减少模块间的耦合。 - **内存管理**:明确动态分配与释放的责任,防止资源泄漏。 - **优化顺序**:合理排列结构体成员以减少内存占用。
980 14
|
存储 编译器 C语言
【C语言】结构体详解 -《探索C语言的 “小宇宙” 》
结构体通过`struct`关键字定义。定义结构体时,需要指定结构体的名称以及结构体内部的成员变量。
660 10
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
1205 13
|
存储 编译器 数据处理
C 语言结构体与位域:高效数据组织与内存优化
C语言中的结构体与位域是实现高效数据组织和内存优化的重要工具。结构体允许将不同类型的数据组合成一个整体,而位域则进一步允许对结构体成员的位进行精细控制,以节省内存空间。两者结合使用,可在嵌入式系统等资源受限环境中发挥巨大作用。
419 12
|
存储 数据建模 程序员
C 语言结构体 —— 数据封装的利器
C语言结构体是一种用户自定义的数据类型,用于将不同类型的数据组合在一起,形成一个整体。它支持数据封装,便于管理和传递复杂数据,是程序设计中的重要工具。
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
271 4
|
存储 C语言
如何在 C 语言中实现结构体的深拷贝
在C语言中实现结构体的深拷贝,需要手动分配内存并逐个复制成员变量,确保新结构体与原结构体完全独立,避免浅拷贝导致的数据共享问题。具体方法包括使用 `malloc` 分配内存和 `memcpy` 或手动赋值。
459 10
|
安全 编译器 Linux
【c语言】轻松拿捏自定义类型
本文介绍了C语言中的三种自定义类型:结构体、联合体和枚举类型。结构体可以包含多个不同类型的成员,支持自引用和内存对齐。联合体的所有成员共享同一块内存,适用于判断机器的大小端。枚举类型用于列举固定值,增加代码的可读性和安全性。文中详细讲解了每种类型的声明、特点和使用方法,并提供了示例代码。
155 3
|
存储 大数据 编译器
C语言:结构体对齐规则
C语言中,结构体对齐规则是指编译器为了提高数据访问效率,会根据成员变量的类型对结构体中的成员进行内存对齐。通常遵循编译器默认的对齐方式或使用特定的对齐指令来优化结构体布局,以减少内存浪费并提升性能。
|
编译器 C语言
共用体和结构体在 C 语言中的优先级是怎样的
在C语言中,共用体(union)和结构体(struct)的优先级相同,它们都是用户自定义的数据类型,用于组合不同类型的数据。但是,共用体中的所有成员共享同一段内存,而结构体中的成员各自占用独立的内存空间。