JNI学习笔记(一)——C语言基础
程序员文章站
2022-07-15 10:02:24
...
1.开发环境
在cygine用gcc来开发,在window用dev-c++来开发
2.HelloWorld的编写
#include <stdio.h> // 导入标准的输入输出库 java import
#include <stdlib.h> //导入常用函数库 rand()随机数 fopen打开文件 strcpy 字符串拷贝 strcat 字符串拼接
main(){//程序入口
printf("Hello World \n");// java system.out.printf();
system("pause"); //执行DOS命令中的命令 }
3. 基本数据类型
java中的8种基本数据类型
boolean | char | byte | short | int | long | float | double |
---|---|---|---|---|---|---|---|
1byte | 2byte | 1byte | 2byte | 4byte | 8byte | 4byte | 8byte |
C语言中的8种基本数据类型
char | int | float | double | long | short |
---|---|---|---|---|---|
1 | 4 | 4 | 8 | 4 | 2 |
- c语言中char占1byte,java中占2byte
- c语言中long 占4byte,java中占8byte
- java中的byte在c语言里面用char表示
- java中的string在c语言中用char[]表示
- signed ,unsigned修饰类型,不能修饰浮点型(float,double),不影响数据类型的长度
4.输入输出函数
char | int | float | double | long |
---|---|---|---|---|
%c | %d | &f | %lf | %ld |
%x | %o | %s | %#x |
---|---|---|---|
十六进制输出long,int,short | 八进制。。。 | 字符串 | 0x开头的十六进制 |
- 输入函数
char arr[20];
scanf("%d",arr);//参数一:指定类型 参数二:存放位置
*输出函数
printf("i= %d\n",i);
5.指针
- 指针就是存放地址的变量,内存单元的编号
- int * p;//一个存放int型数据类型的内存单元地址;
int i = 5;//1000H
int * p ; //1001H
p = &i;
*p = 1000H;
p = 5;
&p = 1001H;
指针常见错误
- 1 指针未经过初始化不能够使用
- 2不同类型的指针不能够相互转换,一个指针只能指向所对应的数据类型
- 3静态变量不能跨函数访问
6.程序执行原理
内存分为四块地址:
常量区(define PI 3.14; const float PI 3.14;(不可修改))
方法区
栈(2M,一段连续的内存空间,效率高,速度快,程序执行时去使用,系统管理,静态变量或方法)
堆(不连续的内存空间,内存碎片,速度慢,程序员管理,权限高)
7.指针和数组的关系
*数组是一段连续的内存空间,数组名指向数组的首地址
*指针占用的字节数:等于操作系统的位数
8 动态内存分配(malloc,realloc)
- malloc
//malloc()//在堆空间里面动态的申请一段连续的空间 动态变量
//参数一:所要申请的空间的字节数
//返回值:申请空间的首地址
int * p = (int *)malloc(sizeof(int));
*p = 99;
printf("指针p所指向的数据 %d\n",*p);
释放数据
int * p = (int *)malloc(sizeof(int));
*p = 99;
free(p);
- realloc
//realloc()//修改数组
//参数一:指定需要修改的数组
//参数二:指定修改后的数组大小
//返回值:修改后的数组的首地址
int * p = (int *)realloc(arr,len+count);
9.动态内存和静态内存的比较(堆和栈的区别)
- 1 申请方式不同。栈:系统自动分配,自动释放(后进先出) 堆:程序员自己申请,并指明大小(malloc)
- 2 申请后系统的响应。栈:只要申请空间大于栈剩余空间就提供空间,否则报栈溢出。堆:遍历空闲内存地址链表,第一个大于申请空间的地址分配给程序,删除链表中该节点,并将多余的地址节点再次保存在链表里面。
- 3 申请大小限制。栈:连续的,较小的。堆:不连续,较大。
- 4 申请效率比较 。栈:系统自动分配,速度快,程序员无法控制。堆:malloc/new 分配内存,速度慢,有碎片,但是使用方便。
- 5 堆和栈中的存储内容。栈:主函数中下一个指令的地址——>函数的参数——>局部变量(静态变量不入栈)。堆:堆的头部存放用一个字节存放堆的大小,其他由程序员决定。
- 6 内存的回收。 栈:系统自动回收。堆:free()回收
10.函数的指针
void add(int i ,int j){
}
main(){
int (*pf)(int i,int j);//接受两个int参数,返回类型int 型的指针
pf = add;
}
11.结构体和联合体
- 结构体
struct Student{
int age;
float score;
char sex;
}
main(){
struct Student stu = {20,99.0f,'f'};
stu.age = 21;
}
- 结构体长度:当前结构体中单个变量的长度(占有字节数最大的长度)*变量的个数
公式:字节数最大的变量 * 结构体变量个数 - 联合体
struct date{//12
int year;//4
int month;//4
int day;//4
}today;
union{// 匿名联合体
long i;//4
int k;//4
char ii;//1
}mix;
- 联合体 变量共用同一块内存空间 节省内存空间 方法返回类型
长度:占有字节数最大的变量的字节长度
12.枚举
(android中状态标记的时候可以用到)
#include<stdio.h>
enum Weekday{
Monday,Tuesday,Wednessday,Thursday,Friday,Saturday,Sunday
};
main(){
enum Weekday day = Sunday;
printf("day = %d\n",day);//day = 6;
system("pause");
}
- 默认从0开始,也可以自定义开始值。
enum Weekday{
Monday=1,Tuesday,Wednessday,Thursday,Friday,Saturday,Sunday
};
13.自定义数据类型Typedef
Typedef JavaNativeInterface jni;//jni就是JavaNativeInterface的代号
上一篇: 二进制的加减乘除实现
下一篇: 写一个函数返回参数二进制中 1 的个数