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");
}