- JNI:Java Native Inteface 。java本地接口
- #include <stdio.h>:相当于java的import,作用导入c语言的输入输出包
- #include <stdlib.h>:导入常用的函数库。
- system("pause"); 可以执行命令行中的命令
- pause表示暂停执行;shutdown -s -t 60,表示重启电脑
- 基本数据类型
- java和c语言的8大基本数据类型表示形式
-
char long booleanbyte short int float double java语言 占2字节 占8字节 占1字节 占1字节 占2字节 占4字节 占4字节 占8字节 c语言 占1字节 占4字节 0=false,1=true -- 占2 占4 占4 占8 - char数组:char str[20] = "heima 15"; 或者 char cc[20]={'h','e','y',};
- 指针:char* cc = "heima 15";
- sizeof( ):接一个数据类型,返回指定数据类型占用的字节数
- 输入输出函数:输入输出类型要一致
- 输出:对应的占位符与数据类型
-
%d %ld %f %lf %c %#x %o %s int long float double char 十六进 0x 制输出 八进制输出 字符串输出
-
- 输入:
- scanf( " " , &len ); 接收键盘输入的数据
- //参数1: 指定接收的数据的数据类型
- //参数2: 指定接收的数据存放的位置
- 输出:对应的占位符与数据类型
- 指针和指针变量
- 指针:就是地址,地址是内存单元的编号,例如1000H。
- 指针变量:存放地址的变量。
- int* p = & i :p为存放地址的指针变量,&为取地址值符号。
- *p:取出p存储的内存地址对应的值
- &p:取指针p的地址值
- p:变量p本身的内存地址值
- 指针的重要性:
- 直接访问硬件(opengl)
- 快速传递数据
- 返回一个以上的值
- 表示复杂的数据结构
- 指针表示字符串:
- char* str = "hello world!!!"; printf("str=%s\n",str);
- 指针有助于理解面向对象
- 指针常见错误。
- 指针未经赋值不能使用。
- int * p; printf("不能直接使用未赋值的指针:%#x\n",p); //报错
- 不同类型数据的指针不能相互转换。
- double d = 3.1415; int* p = &d; //类型不能转换
- (**)函数的变量(静态)不能够跨函数访问,失去了函数变量的访问范围(生命周期)
- int** p = (&(&i))
- 指针未经赋值不能使用。
- 传值和传引用
- 传值:传递的是局部变量,方法结束后,局部变量被系统回收了。
- 传引用:传递的是地址值,操作的是内存地址值。
- 堆和栈的关系
- #define PI 3.1415 宏定义
- 方法区:存放所有的方法
- 栈空间:是一块连续的内存空间,执行速度快
- 堆空间:是一块不连续的空间,执行速度稍慢
- 指针和数组的关系:
- 数组是内存中一块连续的空间,数组名是数组中第一个元素的地址。
- c语言中:数组的长度不会检查,循环变量不可以声明在for循环中
- void printarr(int* p){
- int i;
- for(i=0;i<6;i++){
- printf("arr[%d]= %d\n",i,*(p+i));
- }
- }
- main(){
- int arr[] = {12,65,64,23,75,23};
- printarr(arr);
- system("pause");
- }
- 指针的运算:指针运算只有在连续的内存空间(数组)才有意义。
- int i;
- for( i = 0 ; i < 5; i++){
- printf("arr[ %d ]= %d\n", i, *(arr+i));
- }
- 指针占的字节长度:4,和操作系统有关。
- 动态和静态内存的分配:
- 静态内存:系统在运行代码时,自动分配内存空间。
- 例:方法中定义的变量,子函数里面定义的形参都是静态内存分配的变量,当子函数执行完毕后,系统会自动释放掉静态内存空间,程序员不能控制静态内存.
- 动态内存: malloc(sizeof(int)) 申请一块内存空间
- 静态内存:系统在运行代码时,自动分配内存空间。
- int* p = malloc( sizeof(int) ) :程序员动态的申请内存
- 导入malloc包
- 接收一个int类型的参数,参数的意义是 申请多少个byte控件的内存。
- 返回申请空间的首地址。
- free( p ):动态申请了内存后应该手工释放。接收的参数是内存地址值。
- //通知操作系统,刚才申请的空间可以被重新使用了。
- int* p = malloc(sizeof(int));
- *p = 4;
- printf(" p = %d\n",*p);
- free(p);
- printf(" p = %d\n",*p);
- int* p = malloc( sizeof(int) ) :程序员动态的申请内存
-
动态内存和静态内存的比较
静态内存是系统是程序编译执行后系统自动分配,由系统自动释放,静态内存是栈分配的.动态内存是堆分配的.
- 动态内存分配,realloc()
- int* arr =(int* ) malloc(sizeof(int)*len) ; //动态申请的内存
- arr = realloc( arr, (len+increase)*sizeof(int) ); //可变长度
- 多级指针: int**** p
- 函数的指针
- int add(int x,int y){
- return x+y;
- }
- main(){
- int (*pf)(int x,int y);
- pf = add; //类型要保证一致
- printf("result=%d\n",pf(11,22));
- 结构体,Union联合体
- 结构体:长度为结构元素个数*4的和,但编译器不同,长度可能会不同。
- struct Student stu = {10001,88,'F'};
- stu.number; stu.score;
- 联合体:长度与最长的数据相同
- typedef int haha:haha为int类型的别名。使用时可以 haha i = 8;
- 结构体:长度为结构元素个数*4的和,但编译器不同,长度可能会不同。