JNI所需的C语言知识小结
来源:互联网 发布:如何看网络棋牌频道 编辑:程序博客网 时间:2024/06/03 12:54
介绍
作为Android开发人员,会java是必须的,但是一般从事android业务逻辑开发的对C/C++的了解估计仅限于大学里不走心的课程。。。所以参考视频和资料小结一下JNI所需的c语言知识~
基本数据类型
sizeof()函数是用来测量某个类型所占的字节长度,参数是某种数据类型。
c语言中0为假,非0表示真。
输入输出
输入
int i; // 可以不初始化scanf("int i = %d \n",&i); //&i 取i变量的地址
c语言中没有String类型,通过字符串数组来实现
// 利用scanf %s 的方式 可以从键盘获取一个字符串 char arr[10]={'h','e','l','l','o'}; printf("s = %s\n",arr); //打印字符数组 scanf("%s",arr); //利用字符数组接收一个字符串
字符数组最后一位通常为’\o’,用来表示数组已经结束。
输出
int i = 0;printf("int i = %d \n",i);//输出的通常格式
值得注意的是,如果把字符‘A’按照%d格式 输出那么就是:65 如果把int型的354353453用short型输出,结果为301,分析如下:
354353453为int类型,长度4个字节,其二进制数为:
10101000111110000000100101101
输出的结果为:
0000000100101101
与原来的二进制数后16位相同,实际上就是截断了后两个字节。
指针入门
什么是指针
指针(Pointer)就是内存的地址,C语言允许用一个变量来存放指针,这种变量称为指针变量。指针变量可以存放基本类型数据的地址,也可以存放数组、函数以及其他指针变量的地址。
程序在运行过程中需要的是数据和指令的地址,变量名、函数名、字符串名和数组名在本质上是一样的,它们都是地址的助记符:在编写代码的过程中,我们认为变量名表示的是数据本身,而函数名、字符串名和数组名表示的是代码块或数据块的首地址;程序被编译和链接后,这些名字都会消失,取而代之的是它们对应的地址。
以下为常用指针变量的含义:
使用指针的注意事项
- 指针变量可以进行加减运算,例如p++、p+i、p-=i。指针变量的加减运算并不是简单的加上或减去一个整数,而是跟指针指向的数据类型有关。
- 使用指针变量之前一定要初始化,否则就不能确定指针指向哪里,如果它指向的内存没有使用权限,或者是程序运行所需的某个重要的值,修改之后,程序就崩溃了。对于暂时没有指向的指针,被成为“野指针”建议赋值NULL。
- 数组也是有类型的,数组名的本意是表示一组类型相同的数据。在定义数组时,或者和 sizeof、& 运算符一起使用时数组名才表示整个数组,表达式中的数组名会被转换为一个指向数组的指针。
- 指针的长度是4个字节,因为不管什么类型的指针,其本质都是地址,只要长度足够存放地址就可以了。
为什么要使用指针
- 直接访问硬件 (opengl 显卡绘图)
- 快速传递数据(指针表示地址)
- 返回一个以上的值(返回一个数组或者结构体的指针)
- 表示复杂的数据结构(结构体)
- 方便处理字符串
- 指针有助于理解面向对象
内存分配
静态内存分配
静态内存是系统程序编译执行后系统自动分配,由系统自动释放,静态内存是栈分配的,动态内存是堆分配的.
void function(int *p){ int j = 0; p = &j; printf("p=%#X\n",p);}main(){ int *p1; function(p1); printf("p1=%#X\n",p1); system("pause"); }
把函数中的变量i的地址保存到main函数中的p1指针中,上面的代码是无法做到的,因为hanshu 中把i的地址赋值给了p指针,而这个指针是个局部变量了,fun方法一结束该指针就销毁了。并没有把i的地址赋值给p1。
动态内存分配
void fun(int** p2){ int* p = (int*)malloc(4); /*malloc()接受一个参数 int 代表申请多少个byte的空间,该函数返回该空间的首地址。如果想保存一个int型数据,那么就可以申请4个字节来保存int。(int*)强转,是为了说明这个空间返回的地址是保存int型指针类型的。 */ printf("&i=%#X\n",p); *p = 5; *p2 = p; } main(){ int* p1; fun(&p1); printf("p1=%#X\n",p1); printf("p1保存的地址保存的值为%d\n",*p1); /*结果为5,因为这个5是在堆内在中申请的,自组织系统不会自动释放,需要我们手动释放。在fun方法的代码最后加上:free(p); 则这时main方法中就打印不出正确的5了。*/ system("pause"); //free(p);}
注意:
char* p1 = (char *)malloc(10) 这句代码其实是分两部分执行的,这一整句代码总共申请了14个字节,左边申请了一个4个字节大小的指针变量,右边申请了10个字节用于保存字符。
杂项
函数指针
函数名在表达式中有时也会被转换为该函数所在内存区域的首地址,我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使指针变量指向函数所在的内存区域,然后通过指针变量就可以找到并调用该函数。这种指针就是函数指针。
定义形式:
returnType (*pointerName)(param list);
使用范例:
#include <stdio.h>//返回两个数中较大的一个int max(int a, int b){ return a>b ? a : b;}int main(){ int x, y, maxval; //定义函数指针 int (*pmax)(int, int) = max; //也可以写作int (*pmax)(int a, int b) printf("Input two numbers:"); scanf("%d %d", &x, &y); maxval = (*pmax)(x, y); printf("Max value: %d\n", maxval); return 0;}
结构体
类似java里面的类,形式为:
struct 结构体名{ 结构体所包含的变量或数组};//记得加分号
比如一个学生结构体
struct stu{ char *name; //姓名 int num; //学号 int age; //年龄 char group; //所在学习小组 float score; //成绩};//写法二,定义了一个别名struct stu{ char *name; //姓名 int num; //学号 int age; //年龄 char group; //所在学习小组 float score; //成绩} stu1, stu2;//写法三struct{ //没有写 stu char *name; //姓名 int num; //学号 int age; //年龄 char group; //所在学习小组 float score; //成绩} stu1, stu2;
结构体使用点运算符获得成员变量。
联合体
定义格式为:
union 共用体名{ 成员列表};
结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。
共同体的定义与结构体类似:
union data{ int n; char ch; double f;};union data a, b, c;
typedef
声明自定义数据类型,配合各种原有数据类型来达到简化编程的目的的类型定义关键字。
typedef struct stu{ char name[20]; int age; char sex;} STU;STU body1,body2;//等价于:struct stu body1, body2;
枚举
enum WeekDay { Monday=8,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday }; int main(void) { enum WeekDay day = Sunday; printf("%d\n",day); //打印结果为14,因为Monday为8,Tuesday就是9,一直到Sunday是14 system("pause"); return 0;} //如果需要定义连续的一串数据就可以使用枚举
枚举类型大小和int型一样,都占用4个字节。
- JNI所需的C语言知识小结
- C语言知识小结
- C语言文件知识小结
- C语言重点知识小结
- C语言移位知识小结
- 【C语言】【指针相关知识小结】
- C语言算法知识(201607)-小结
- C语言知识小结(一)
- C语言知识小结(二)
- C语言·数组知识小结
- C语言知识小结(三)
- C语言知识小结(四)
- C语言知识小结(五)
- jni入门之javah自动生成jni的c文件所需头文件
- Unix环境下的编程,所涉及的主要c语言知识
- C语言的知识积累
- C语言的初步知识
- c 语言的一些知识
- 积分图
- mac xcode最新版本 迅雷下载 官网下载 离线下载 非app store
- scoket通讯过程中的封包,解包与异或加密等
- box-shadow阴影
- web兼容---ie8、9、10、11hack、注释ie版本css样式hack
- JNI所需的C语言知识小结
- Kotlin笔记(二)环境配置及HelloWord
- ubuntu14.04+cuda8.0(GTX1080)+caffe安装
- C# 类的属性、对象
- WPF 模板选择器
- public staticvoid main(String[]args)函数解析
- redis 学习笔记
- 北邮人论坛面经转载(3)
- thinkphp 模版布局