android下JNI開發java
what 什麼是JNIandroid
why 爲何要用JNIc++
How 怎麼用JNI程序員
C基本語法windows
CHelloWorld數組
#include<stdio.h> // 至關於 java的import .h c的頭文件 stdio.h standard io 標準輸入輸出 #include<stdlib.h> // stdlib standard library 標準函數庫 java.lang /** */ main(){ // public static void main(String[] args) printf("helloworld!\n"); //System.out.println(); "\n"換行符 system("javac Hello.java"); system("java Hello"); system("notepad"); system("pause"); //system執行windows的系統命令 }
C的基本數據類型安全
char, int, float, double, long, short, signed, unsigned, void
* signed 有符號數 最高位是符號位 能夠表示負數 可是表示的最大值相對要小
* unsigned 無符號數 最高位是數值位 不能夠表示負數 表示的最大值相對要大
* signed unsigned 只能用來修飾整形變量 char short int long
* C沒有 boolean byte C用0和非0表示false true函數
C的輸出函數 printf學習
%d - intspa
%ld – long int
%lld - long long
%hd – 短整型
%c - char
%f - float
%lf – double
%u – 無符號數
%x – 十六進制輸出 int 或者long int 或者short int
%o - 八進制輸出
%s – 字符串
* printf(「含有佔位符的要輸出的字符串」,…..);
* 佔位符不要亂用 要選擇正確的對應類型 不然可能會損失精度
* C字符串
* C沒有String類型 C的字符串實際就是字符數組
* C數組定義 [ ]只能再變量名以後
* C字符串兩種定義方式
char str[] = {'h','e','l','l','o','\0'};//注意'\0'字符串結束符 char str[] = "你好"; //這種定義方式不用寫結束符 能夠表示漢字
C的輸入函數
內存地址的概念
指針概念 **
int i = 123; //通常計算機中用16進制數來表示一個內存地址 printf("%#x\n",&i); //int* int類型的指針變量 pointer指針 指針變量只能用來保存內存地址 //用取地址符&i 把變量i的地址取出來 用指針變量pointer 保存了起來 //此時咱們能夠說 指針pointer指向了 i的地址 int* pointer = &i; printf("pointer的值 = %#x\n",pointer); printf("*pointer的值%d\n",*pointer); *pointer = 456; printf("i的值是%d\n",i); system("pause");
* 指針常見錯誤
* 聲明瞭指針變量後 未初始化直接經過*p 進行賦值操做 運行時會報錯
* * 未初始化直接使用的指針稱爲野指針
* 指針類型錯誤 如int* p 指向了double類型的地址, 經過指針進行讀取操做時,讀取值會出錯
指針的練習
void swap(int* p, int* p2){ int temp = *p; *p = *p2; *p2 = temp; } main(){ int i = 123; int j = 456; //將i, j的地址傳遞過去 swap(&i,&j); printf("i = %d, j = %d", i, j); }
數組和指針的關係
main(){ //char array[] ={'a','b','c','d','\0'}; int array[] = {1,2,3,4,5}; 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的地址是%#x\n",&array); char* p = &array[0]; //int* p = &array; //char* p = &array; printf("p+0 = %#x\n",p+0); printf("p+1 = %#x\n",p+1); printf("p+2 = %#x\n",p+2); printf("p+3 = %#x\n",p+3); /* printf("*(p+0) = %c\n",*(p+0)); printf("*(p+1) = %c\n",*(p+1)); printf("*(p+2) = %c\n",*(p+2)); printf("*(p+3) = %c\n",*(p+3)); */ printf("*(p+0) = %d\n",*(p+0)); printf("*(p+1) = %d\n",*(p+1)); printf("*(p+2) = %d\n",*(p+2)); printf("*(p+3) = %d\n",*(p+3)); printf("*(p+3) = %d\n",*(p+4)); system("pause"); }
指針的長度
main(){ int* p; double* p1; printf("p佔%d個字節\n",sizeof p); printf("p1佔%d個字節\n",sizeof p1); system("pause"); }
多級指針
int i = 123; //int類型一級指針 int* p = &i; //int 類型 二級指針 二級指針只能保存一級指針的地址 int** p2 = &p; //int 類型 三級指針 三級指針只能保存二級指針的地址 int*** p3 = &p2; //經過p3 取出 i的值 printf("***p3 = %d\n", ***p3);
void function(int** p1){ int i = 123; *p1 = &i; printf("i的地址%#x\n",&i); } main(){ int* p; function(&p); printf("*p = %d\n",*p); printf("p的值%#x\n",p); system("pause"); }
堆棧概念靜態內存分配動態內存分配
結構體
typedef struct Student{ double score; //8 short age; //2 char sex; //1 //聲明瞭一個函數指針study void (*study)(); } s; void study(){ printf("好好學習,每天向上!\n"); } main(){ s stu = {99.9,18,'f',&study}; stu.age = 20; stu.study(); printf("stu.score = %.1lf\n",stu.score); printf("stu.age = %hd\n",stu.age); printf("stu.sex = %c\n",stu.sex); printf("stu的大小佔%d個字節\n",sizeof(stu)); //聲明瞭一個結構體指針p 來保存結構體變量stu的地址 struct Student* p = &stu; (*p).age = 30; //-> 間接引用運算符 p->age = 40; p->study(); printf("stu.age = %hd\n",stu.age); system("pause"); }
聯合體
枚舉
結構體的練習
#include<stdlib.h> #include<stdio.h> //給結構體struct Light 起別名 light typedef struct Light light; struct Light{ //用來表示等開關的狀態 int state; //聲明兩個函數指針 //關燈的函數指針 經過函數修改light的狀態 //要接收一個light的地址 因此形參爲light*類型 void(*turnOff)(light*); //開燈的函數指針 void(*turnON)(light*); }; //關燈的函數 void turnOff(light* l){ //經過結構體的指針修改結構體的變量state l->state = 0; printf("關燈\n"); } //開燈的函數 void turnON(light* l){ //經過結構體的指針修改結構體的變量state l->state = 1; printf("開燈\n"); } //模仿一個構造方法 作兩件事兒 ① 申請一塊堆內存 ② 給結構體的成員賦初始值 light* newLight(){ //申請一塊堆內存 用來保存light這個結構體的實例 light* led = (light*)malloc(sizeof(light)); //初始化 led->state = 0; //給函數指針turnOff賦初始值 使函數指針指向具體的函數 led->turnOff = &turnOff; // 給函數指針turnON賦初始值 使函數指針指向具體的函數 led->turnON = &turnON; return led; } main(){ //調用模仿的構造方法 返回一個結構體Light的引用 light* led = newLight(); //調用結構體中turnON開燈這個函數指針 led->turnON(led); printf("led->state = %d\n",led->state); system("pause"); }