Android For JNI(五)——C语言多级指针,结构体,联合体,枚举,自定义类型
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来
Android For JNI(五)——C语言多级指针,结构体,联合体,枚举,自定义类型的更多相关文章
- C语言基础(19)-结构体,联合体,枚举和typedef
一.结构体 1.1 结构体struct定义及初始化 #include <stdio.h> // 这个头文件在系统目录下 #include <stdlib.h> // 使用了sy ...
- Android JNI编程(六)——C语言函数指针、Unition联合体、枚举、Typedef别名、结构体、结构体指针
版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 一:函数指针 1.函数指针顾名思义就是定义一个指针变量指向一个函数,和一级指 ...
- Android For JNI(二)——C语言中的数据类型,输出,输入函数以及操作内存地址,内存修改器
Android For JNI(二)--C语言中的数据类型,输出,输入函数以及操作内存地址,内存修改器 当我们把Hello World写完之后,我们就可以迈入C的大门了,今天就来讲讲基本的一些数据类型 ...
- C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com
原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | I ...
- C语言第九讲,结构体
C语言第九讲,结构体 一丶结构体的定义 在C语言中,可以使用结构体(Struct)来存放一组不同类型的数据.结构体的定义形式为: struct 结构体名{ 结构体所包含的变量或数组 }; 结构体是一种 ...
- 【AT91SAM3S】SAM3S-EK Demo工程中,LCD驱动程序的加载(函数指针结构体)
为了调试LCD,在英倍特的板子上烧Atmel的sam3s-ek_demo_1.4_source示例代码.LCD显示正常了,却找不到LCD的驱动究竟在哪. 花了好久,追踪到了这个执行过程. 进入main ...
- 不可或缺 Windows Native (8) - C 语言: 结构体,共用体,枚举,类型定义符
[源码下载] 不可或缺 Windows Native (8) - C 语言: 结构体,共用体,枚举,类型定义符 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 结构体 ...
- C语言笔记之结构体
结构的本质是C语言的一种数据抽象,通俗的说,是基本数据类型的重组. 为什么要重组呢?由于基本数据类型不够用了.为什么不够用了呢?由于须要的信息类型太多了. 这是一个非常大的话题.信息本来是没有什么类型 ...
- Go语言基础之结构体
Go语言基础之结构体 Go语言中没有“类”的概念,也不支持“类”的继承等面向对象的概念.Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性. 类型别名和自定义类型 自定义类型 在G ...
随机推荐
- DB2 911错误的解释
SQL0911N 因为死锁或超时,所以当前事务已回滚.原因码为 "<原因码>". 说明: 当前工作单元参与了未解决的对象争用,因此必须回滚. 原因码如下所示: 2 ...
- Xcode在playground的quick look框中显示对象自定义视图
对于一般对象,playground中默认的quick look显示已经够用,比如简单的字符串,Int,或简单的自定义Class等等. 不过对于有些情况,我们需要自定义对象在playground中的显示 ...
- Hadoop 伪分布式安装、运行测试例子
1. 配置linux系统环境 centos 6.4 下载地址:http://pan.baidu.com/s/1geoSWuv[VMWare专用CentOS.rar](安装打包好的VM压缩包) 并配置虚 ...
- Dynamics CRM2016 Web API之Use custom FetchXML
CRM2016中新增的web api支持fetch xml了,之前使用FetchXML的场景是在后天代码中通过组织服务的retrieve multiple方法,但实际的应用效果有多大,还需要在实际的项 ...
- SQL LOADER使用
转自huan.gu专栏:http://blog.csdn.net/gh320/article/details/17048907 1.执行的命令 sqlldr 数据库用户名/密码 control=控制文 ...
- npm管理工具介绍
概述 Npm是NodeJS包管理工具,在最新版本中Nodejs集成了npm,可以通过输入 "npm -v" 来测试是否成功安装.如果你安装的是旧版本的 npm,可以通过 npm 命 ...
- Hadoop介绍
是适合大数据的分布式存储与计算平台,用java编写的开源系统,能够安排在大规模的计算机平台上,从而长进计算效率:由 HDFS.MapReduce.HBase.Hive 和 ZooKeeper等成员组成 ...
- android 获取SD卡的图片及其路径
1.首先是intent的设置: private static final int IMAGECODE = 0; Intent imageIntent = new Intent(Intent.ACYIO ...
- 多线程之Java线程阻塞与唤醒
线程的阻塞和唤醒在多线程并发过程中是一个关键点,当线程数量达到很大的数量级时,并发可能带来很多隐蔽的问题.如何正确暂停一个线程,暂停后又如何在一个要求的时间点恢复,这些都需要仔细考虑的细节.在Java ...
- C链栈实现
#include <stdlib.h> #include <stdio.h> #include"LinkStack.h" const int TRUE = ...