我們知道 , Android系統(tǒng)是基于linux開(kāi)發(fā) , 采用的是linux內(nèi)核 , Android APP開(kāi)發(fā)大部分也要和系統(tǒng)打交道 , 只是Android FrameWork 幫我們屏蔽了系統(tǒng)操作 , 我們從Android 系統(tǒng)的分成結(jié)構(gòu)可以看出 , Android FrameWork是通過(guò)JNI與底層的C/C++庫(kù)交互 , 例如:FreeType ,OpenGL ,SQLite , 音視頻等等
'
做Android為什么需要學(xué)習(xí)C/C++ ?
- 企業(yè)需要 , 現(xiàn)在大部分招聘 , 基本上都會(huì)要求會(huì)JNI
- 進(jìn)階需要 , 如果想要研究Android源碼 , 那么不會(huì)C/C++ , 行不通
- 音視頻時(shí)代到來(lái) (直播) , 音視頻處理 , 很大部分都需要C/C++完成(音視頻編解碼)
那么下面就一起開(kāi)始學(xué)習(xí)C吧 ! let's go
不同的操作系統(tǒng) , 變量的大小可能不一樣 。
C 語(yǔ)言的基本數(shù)據(jù)類型 , 輸出占位符
int - %d
short - %d
long - %ld
float - %f
double - %lf
char - %c
字符串 - %s
八進(jìn)制 - %o
十六進(jìn)制 - %x
指針變量就是用來(lái)操作內(nèi)存空間的 , 當(dāng)然也可以作為變量存儲(chǔ) , 例如int *p = 100 ; printf("指針變量的值:%d\n",p)這樣指針變量p就會(huì)輸出100 。
printf("這樣也可以獲取到數(shù)組的地址:%#x\n", arr);
雖然float和int類型都是四字節(jié)的 , 但是int 和 float的存儲(chǔ)方式不一樣 , 所有指針運(yùn)算會(huì)出現(xiàn)不一樣 。
二級(jí)指針 , 就是指針的指針 , 二級(jí)指針的內(nèi)存空間中 , 存儲(chǔ)的是一級(jí)指針的內(nèi)存地址
int i = 10;
// p指針變量存儲(chǔ)的是i的內(nèi)存地址
int* p = &i;
// p1指針變量存儲(chǔ)的是p的內(nèi)存地址
int** p1 = &p;
指針是操作內(nèi)存的神器 , 多級(jí)指針 , 只要記住 , 多級(jí)指針里面存儲(chǔ)的是上級(jí)指針的地址即可 。
函數(shù)指針存儲(chǔ)的是函數(shù)的內(nèi)存地址
// windows 彈出框頭文件
#include <Windows.h>
/*函數(shù)*/
void message() {
MessageBox(NULL, "我是彈出框", "消息", NULL);
}
void main() {
// 函數(shù)指針定義 , 返回值(函數(shù)指針名稱)(函數(shù)參數(shù)) = 函數(shù)名稱
void(*func_p)() = &message;
// 調(diào)用函數(shù)指針
func_p();
printf("函數(shù)指針地址:%#x\n", func_p);
getchar();
}
有了我們的函數(shù)指針 , 我們可以做很多事情 , 下面我們來(lái)看一個(gè)簡(jiǎn)單的示例:
int add(int num1, int num2) {
return num1 + num2;
}
int minus(int num1, int num2) {
return num1 - num2;
}
// 將函數(shù)指針直接定義到函數(shù)形參中 , 類似java中的多態(tài)
// 我們可以函數(shù)指針作為函數(shù)參數(shù)傳入
void showMsg(int(*c)(int num1, int num2), int a, int b) {
int r = c(a, b);
printf("計(jì)算完成=%d\n", r);
}
void main() {
showMsg(add, 10, 10);
showMsg(minus, 30, 2);
}
getchar();