C语法


JNI的概念

Java Native Interface java本地接口 
Native Native Language 本地语言 看操作系统使用什么语言开发的 那么这个语言就是本地语言 
java c/c++ 通信的接口

Java 特点 一处编译到处运行 通过java虚拟机 把java代码和底层的操作系统隔离起来 
c/c++ 平台相关性强

① java 想与硬件之间直接交互 不能直接交互 需要访问硬件的驱动 java需要调用C的代码 
② java 运行的速度 比c要慢一些 高清视频回放 视频解码的库都是用c/c++去开发的 
③ java 编译之后生成.class .class可以很容易的进行反编译 c编译之后生成机器码 机器码只能反汇编 
金融软件 
④ c语言有好多开源库 openCV ffmpeg vitamio

学习的目的 ①可以看懂android 所有的源码 
② 有一些特定的需求 需要通过调用C去实现 需要使用JNI

Native c语言的基础 能看懂会调用 
Interface NDK native develop kit 
Java->C 
c-> java 
实际案例

    printf("Hello World!\n");

 

c 基本数据类型 
java的基本数据类型 C的基本数据类型 
boolean 没有boolean 0 false 非0 true 
byte 没有byte 

    printf("char类型占%d个字节\n", sizeof(char));
    printf("short类型占%d个字节\n", sizeof(short));
    printf("int类型占%d个字节\n", sizeof(int));
    printf("long类型占%d个字节\n", sizeof(long));
    printf("float类型占%d个字节\n", sizeof(float));
    printf("double类型占%d个字节\n", sizeof(double));
    int ii = 0;
    unsigned char cc = 256;
    printf("c = %d\n", cc);

 

signed和unsigned 可以用来修饰整形变量 short int long char 
signed 有符号 默认情况下都是有符号的 
unsigned 无符号 使用了unsigned 来修饰整形变量 这个整形变量的最高位就是数值位 不再是符号位

C 输出函数 
00000000 10111100 01100001 01001110 
01100001 01001110 
使用占位符的时候 一定要注意 类型和占位符之间一定要一一对应 如果用错了可能会出现问题

C 数组的声明 [] 一定要放到变量名字的后面 
char str[]

#include <stdlib.h>   // include 包含 类似java 的import 

#include <stdio.h>   // .h head C的头文件   std standard 标准的   stdlib 标准函数库  stdio.h 标准输入输出流

/**

%d  -  int

%ld – long int

%lld - long long

%hd – 短整型  short

%c  - char

%f -  float

%lf – double

%u – 无符号数

%x – 十六进制输出 int 或者long int 或者short int

%o -  八进制输出

%s – 字符串

*/

    char c = 'a';
    short s = 1234;
    int i = 12345678;
    long l = 1234567890;
    float f = 3.14;
    double d = 3.1415926;
    printf("c = %c\n", c);
    printf("s = %hd\n", s);
    printf("i = %d\n", i);
    printf("l = %ld\n", l);
    printf("f = %.2f\n", f);
    printf("d = %.7lf\n", d);
    printf("i = %#x\n", i);
    printf("i = %#o\n", i);
    char str[] = { 'a','b','c','d','e','\0' };
    char str1[] = "你好";
    printf("str =%s\n", str1);

 

 

    //java 字符串 string    c的字符串实际上就是字符的数组  字符数组结束的标记就是 '\0'  

 

    char str4[] = { 'a','b','c','d','e','\0' };
    char str2[] = "abcde";
    char *str3 = "你好";
    printf("%s\n", str3);
    printf("%#x\n", str3);

 

C 输入函数

    int count;
    printf("请输入班级的人数:");
    scanf("%d", &count);
    printf("班级的人数为: %d\n", count);
    printf("count的地址:%d\n", &count);
    char name[2];
    printf("name的地址:%d\n", &name);
    printf("请输入班级的名字:");
    scanf("%s", &name);
    printf("班级的人数是:%d\n班级的名字是:%s\n", count, name);

 

内存地址的概念 
内存的最小单位 byte 8位二进制数 
内存要使用的时候 一定得对每一个byte进行编号 只有编号之后才能使用 
32位系统 xp /win7 地址线32位 4G的内存 
64位系统

C 的指针 ☆☆☆☆☆

    int i1 = 456;
    int *p = &i1;
    printf("p =%#x\n", p);
    printf("i的地址:%#x\n", &i1);
    printf("*p = %d\n", *p);
    *p = 789;
    printf("i = %d\n", i1);

 

C指针的常见错误

    double *p2 = &i1;
    printf("*p2 = %lf\n", *p2);

 

C 指针的练习 
交换两个数的值 
值传递 调用函数/方法的时候 传到方法中的是变量的值 值传递 
引用传递 调用函数/方法的时候 传到方法中的也是数值 只不过这个值是一个地址值 引用传递 
交换两个数

    int i2 = 123;
    int j2 = 456;
    swap2(&i2, &j2);
    printf("i = %d,j = %d\n", i2, j2);

 

返回多个值

    function(&i2, &j2);
    printf("i = %d,j = %d\n", i2, j2);

 

C 数组 和指针之间的关系 
java的数组 是一块连续的内存空间

    int array[] = { 1,2,3,4,15 };
    printf("array[0]的地址%#x\n", &array[0]);
    printf("array[1]的地址%#x\n", &array[1]);
    printf("array[2]的地址%#x\n", &array[2]);
    printf("array[3]的地址%#x\n", &array[3]);
    printf("array[4]的地址%#x\n", &array[4]);
    printf("array的地址%#x\n", &array);
    double *p3 = &array;
    printf("array[0]的地址%d\n", *(p3 + 0));
    printf("array[1]的地址%d\n", *(p3 + 1));
    printf("array[2]的地址%d\n", *(p3 + 2));
    printf("array[3]的地址%d\n", *(p3 + 3));
    printf("array[4]的地址%d\n", *(p3 + 4));
    printf("p+0的地址%d\n", p3 + 0);
    printf("p+1的地址%d\n", p3 + 1);
    printf("p+2的地址%d\n", p3 + 2);
    printf("p+3的地址%d\n", p3 + 3);
    printf("p+4的地址%d\n", p3 + 4);

 

C的字符串的最常用的声明方式

    char str4[] = { 'a','b','c','d','e','\0' };
    char str2[] = "abcde";
    char *str3 = "你好";
    printf("%s\n", str3);
    printf("%#x\n", str3);

 

C指针变量的长度

C 的多级指针 
用2级指针保存1级指针的地址 
用n级指针 保存 n-1级指针的地址

    int *p7;
    double *p8;
    printf("int类型指针变量占%d个字节,double类型指针变量占%d个字节\n", sizeof(p7), sizeof(p8));

 

main函数中 获取子函数临时变量的地址

    float *p9;
    function2(&p9);
    printf("p = %#x\n", p9);

 

静态内存分配和动态内存分配 
静态内存分配 栈内存 大小固定 高地址向低地址扩展 栈内存的分配和回收是系统控制

    int *p10 = function3();
    function4();
    printf("*(p+0) =%d,*(p+1) =%d,*(p+2) =%d,*(p+3) =%d,*(p+4) =%d\n", *(p + 0), *(p + 1), *(p + 2), *(p + 3), *(p + 4));
    printf("*(p+0) =%d,*(p+1) =%d,*(p+2) =%d,*(p+3) =%d,*(p+4) =%d\n", *(p + 0), *(p + 1), *(p + 2), *(p + 3), *(p + 4));
    

 

C 的结构体☆☆☆☆☆ 
C 的联合体 
C 的枚举 
C 的自定义类型

 

转载于:https://www.cnblogs.com/nangongyibin/p/10465013.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值