欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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的代号