JNI学习笔记(一)——C语言基础

1.开发环境

在cygine用gcc来开发,在window用dev-c++来开发

2.HelloWorld的编写

#include  // 导入标准的输入输出库 java import 
#include  //导入常用函数库 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
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的代号

你可能感兴趣的:(JNI学习笔记(一)——C语言基础)