android JNI 开发技术的使用,FrameWork层能够很好的和底层硬件结合,而硬件的操作基本使用C语言程序。所以在android开发的过程中,了解基础C语言,是很重要的一环。
C语言基础知识整理
一:我的第一个HelloWorld!
//c++的头文件
#include <stdio.h>
//C++中主要的类库
#include <stdlib.h>
//相当于java中的 public static void main(String strs[]){}
main(){ //函数开始
printf("Hello: wangxiaobo\n wang");//输出打印函数
system("services.msc");
system("mspaint");
/*
之前错误的理解为:C语言不需要进行编译,其实C也是需要编译执行
1:在dos 环境下,完全在c 语言中调用java代码中的方法
step1:将自己编译好的java代码路径在window环境变量中的 CLASSPATH 中配置
setp2: 直接在C语言中进行 调用
*/
system("java Test");
system("pause");//doc 执行命令 控制台 console 停留
}
SUMMARY:使用简单的C语言命令,可以操作相关系统的应用。
二:C语言基础知识
C基本数据类型 类型长度 C语言中对应的占位符
int 4 %d
double 8 %lf
float 4 %f
long 4 %ld
short 2 %sd
char 1 %c
void
signed 4
unsigned 4
C中没有String,boolean类型,但是在c中对string占位符为 %s
C中输出内存地址的占位符 %#x
C中输出16进制的占位符 %o
sizeof(int)函数:返回数据类型的长度
对于小数位精度保留 %.2lf 表示对double类型的小数位保留两位小数,默认四舍五入
三:C语言中的指针
指针:存储内存地址。但是不要误以为指针本身不占有内存空间,实际上指针本身也是占有内存的
不过它的存储值为内存
int* pointer;
*pointer :表示获取指针对应内存地址存储的值
指针和指针变量的关系与区别
可变
具体的值
四:C语言中的数组
要点:数组是一块连续的内存空间
数组的内存地址与数组中首个元素的内存地址相同
对于数组而言:
char cArray[] = {'H','E','L','L','O'};
printf("取出相应的值:\n");
printf("cArray[0]==%c\n",cArray[0]); //数组取值
printf("查看cArray相应的内存地址:\n");
printf("&cArray[0]==%#x\n",&cArray[0]);//数组取址
//对于数组中取值与取址的新方法
printf("查看cArray相应的内存地址:\n");
int j;
for(j=0;j<5;j++){
printf("cArray+%d==%#x\n",j,cArray+j);
}
printf("查看cArray相应的值:\n");
for(j=0;j<5;j++){
printf("cArray+%d==%c\n",j,*(cArray+j));
}
五:C语言中的多级指针
int* p1;
int** p2;
int*** p3;
这种情况下的指针操作,说白了,也就是指针的地址间的相互转化,调用
main(){
//定义一个变量
int i = 100;
printf("&i==%#x\n",&i);
//address1指向地址为i的地址
int* address1 = &i;
printf("address1==%#x\n",address1);//地址
printf("&address1==%#x\n",&address1);// 对应地址的值的地址
//二级指针,地址的地址
int** address2 = &address1;
printf("address2==%#x\n",address2);
printf("&address2==%#x\n",&address2);
//三级指针
int*** address3 = &address2;
printf("address3==%#x\n",address3);
printf("&address3==%#x\n",&address3);
int**** address4 = &address3;
printf("address4==%#x\n",address4);
printf("&address4==%#x\n",&address4);
//指针取值
printf("****address4==%d\n",****address4);
system("pause");
}
六:C静态分配内存和动态分配内存
静态分配内存:存在系统会在不定时的清理内存
动态分配内存:需要使用动态分配内存地址函数 malloc(int) 返回一个内存地址
/*静态分配内存地址*/
void staticMemory(int** param){
int i = 100;
//指针前面+* 表示 指针对应内存地址的值
*param = &i;
}
/*动态分配内存地址*/
void dynamicMemory(int** params){
int i = 100;
/*指针指的是内存地址,所以它的长度为4*/
int* pointer;
/*动态分配地址的主要方法 malloc()*/
pointer = (int*)malloc(sizeof(int)); //4,该方法返回的是一块内存地址值,那么使用指针来接收
*pointer = i;
*params = pointer;
}
main(){
/*创建指针age 此时他本身是占有内存空间的*/
int* age;
/*调用函数,进行地址分配*/
staticMemory(&age);
printf("*age==%d\n",*age);
//静态分配内存,在不确定的时间内系统会自动回收,这个如何控制,不知道
printf("*age==%d\n",*age);
printf("*age==%d\n",*age);
dynamicMemory(&age);
printf("*age==%d\n",*age);
printf("*age==%d\n",*age);
printf("*age==%d\n",*age);
system("pause");
}
七:动态分配数组内存地址
应用realloc(*_,int);方法,来重新分配内存
main(){
//输入数组的长度
printf("Please input Array length:\n");
int length;
scanf("%d",&length);
//提示
printf("The Array length is :%d\n",length);
int* array = (int*)malloc(length*sizeof(int));
int i;
for(i = 0;i<length;i++){
//提示用户
printf("Please input Array[%d] value\n",i);
scanf("%d",array+i);//对对应的内存地址赋值
}
printf("---------------------------------I want to realloc memory:--------------------------\n");
printf("please input the Array new length:\n");
int newLength;
scanf("%d",&newLength);
printf("The new Array length is : %d\n",newLength);
//重新分配内存空间的函数 realloc()
array = (int*)realloc(array,(length+newLength)*sizeof(int));
for(i = length;i<length+newLength;i++){
//提示用户
printf("Please input Array[%d] value\n",i);
scanf("%d",array+i);//对对应的内存地址赋值
}
//打印出相应的数据
for(i=0;i<length+newLength;i++){
printf("Array[%d]==%d\n",i,*(array+i));
}
system("pause");
}
八:C函数指针
/*定义一个小函数*/
int add(int a,int b){
return a+b;
}
main(){
//定义函数指针,没有方法体,括号中有*号
int (*func1)(int a,int b);
func1 = add;
int resule = func1(1,2);
printf("resule==%d\n",resule);
system("pause");
}
九:C联合体(union)
/*
联合体 Unition
所有的字段均使用同一块内存空间,即长度为4
各个类型容易转化
*/
union Size{
int small;//4
int large;//4
int middle;//4
};
main(){
printf("union Size == %d\n",sizeof(union Size));
/*
union Size == 4
请按任意键继续. . .
原因:所有的字段均使用同一块内存空间,即长度为4
*/
union Size s;
s.large=10;
s.middle = 5;
s.small = 1;
printf("Size.large==%d\n",s.large);
printf("Size.middle==%d\n",s.middle);
printf("Size.small==%d\n",s.small);
//因为其联合体公用统一内存空间,所以修改值之后,对其中的值进行修改,其余的获得的值同样被修改
system("pause");
}
十:C枚举(enum)
/*
枚举默认的首元素是 0
*/
/*enum 函数:默认从0开始,递增*/
enum week{
Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday
}
/*当将Sunday=1,的时候,获取到的Saturday的值为7*/
main(){
//使用enum,必须先声明
enum week weeks = Sunday;
printf("weeks==%d\n",weeks);
system("pause");
}
十一:typeof 别名 当数据类型很长,可以使用这个方式。自定义的类很长,可以使用
十二:结构体
问题:C中的结构体的长度为 12 ,原因百度可查
/*
定义结构体
这样的使用很类似于java中的POJO类
*/
struct student{
int age;//4
float score;//4
char sex;//1
};
main(){
//使用结构体
struct student stu = {18,98.9,'w'};
printf("stu.age==%d\n",stu.age);
printf("struct student length == %d\n",sizeof(struct student));
system("pause");
}
十三:结构体指针
/*
定义结构体
这样的使用很类似于java中的POJO类
*/
struct student{
int age;//4
float score;//4
char sex;//1
};
main(){
//使用结构体
struct student stu = {18,98.9,'w'};
struct student* stuPoint = &stu;
/*等价*/
printf("(*stuPoint).age == %d\n",(*stuPoint).age);
printf("(*stuPoint).score == %.1f\n",stuPoint->score);
/*重新赋值*/
stuPoint->age = 20;
printf("(*stuPoint).age == %d\n",(*stuPoint).age);
system("pause");
}