作為一個Android開發者,怎能不會NDK開發,下面我們開始我們的NDK之旅
怎么搭建環境我們暫且不管,隨心而為
基本數據類型
1.signed---有符號,可修飾 char、int。Int是默認有符號的。
2.unsigned---無符號,可修飾 int 、char
整型 | 字節 | 取值范圍 | 占位 |
---|---|---|---|
int | 4 | -2,147,483,648 到 2,147,483,647 | %d |
unsigned int | 4 | 0 到 4,294,967,295 | %u |
short | 2 | -32,768 到 32,767 | %hd |
unsigned short | 2 | 0 到 65,535 | %hu |
long | 4 | -2,147,483,648 到 2,147,483,647 | %ld |
unsigned long | 4 | 0 到 4,294,967,295 | %lu |
char | 1 | -128 到 127 | %c |
unsigned char | 1 | 0 到 255 | %c |
為了得到某個類型或某個變量在特定平臺上的準確大小,使用 sizeof 運算符。
表達式 sizeof(type) 得到對象或類型的存儲字節大小。
long int 其實就是長整型 = long 可以省去int
在標準中,規定 int至少和short一樣長,long至少和int一樣長。
問題探究:
為什么會存在long?
long和int在早期16位電腦時候 int 2字節,long 4字節,而計算機發展到現在,一般32、64下,long和int一樣。和java類比的話,java的long就是 long long 8字節
格式化顯示
浮點型 | 字節 | 精度 | 占位 |
---|---|---|---|
float | 4 | 6位小數 | %f |
double | 8 | 15位小數 | %lf |
long double | 8 | 19位小數 | %Lf |
8進制 %o
16進制 小寫: %x 大寫:%X
(0x)+16進制前面 %#x
其他一些東西
C99標準以前,C語言里面是沒有bool,C++里面才有,
C99標準里面定義了bool類型,需要引入頭文件stdbool.h
bool類型有只有兩個值:true =1 、false=0。
因此實際上bool就是一個int
所以在c/c++中 if 遵循一個規則, 非0為true,非空為true;
NULL 其實也就是被define為了 0
格式化
printf、sprintf等
將格式化的數據寫入第一個參數
char str[100];
sprintf(str, "img/png_%d.png", 1);
printf("%s", str);
//使用 0 補到3個字符
sprintf(str, "img/png_%03d.png", 1);
printf("%s", str);
數組與內存布局
數組 : 連續的內存
//java
int[] a
//c
//必須聲明時候確定大小
int a[10]
//或者 直接初始化
int a[] = {1,2,3}
//大小
printf("%d",sizeof(a)/sizeof(int));
棧內存限制 linux:ulimit -a 查看
但是直接分配這么大不行,因為堆棧可能保存參數,返回地址等等信息
動態內存申請
malloc
沒有初始化內存的內容,一般調用函數memset來初始化這部分的內存空間.
calloc
申請內存并將初始化內存數據為NULL.
int pn = (int)calloc(10, sizeof(int));
realloc
? 對malloc申請的內存進行大小的調整.
char *a = (char*)malloc(10);
realloc(a,20);
特別的:
alloca
在棧申請內存,因此無需釋放.
int *p = (int *)alloca(sizeof(int) * 10);
物理內存
物理內存指通過物理內存條而獲得的內存空間
虛擬內存
一種內存管理技術
電腦中所運行的程序均需經由內存執行,若執行的程序占用內存很大,則會導致內存消耗殆盡。
虛擬內存技術還會勻出一部分硬盤空間來充當內存使用。
進程分配內存主要由兩個系統調用完成:brk和mmap 。
- brk是將_edata(指帶堆位置的指針)往高地址推;
- mmap 找一塊空閑的虛擬內存。
通過glibc (C標準庫)中提供的malloc函數完成內存申請
malloc小于128k的內存,使用brk分配內存,將_edata往高地址推,大于128k則使用mmap
存放程序執行代碼(cpu要執行的指令)
棧是向低地址擴展數據結構
堆是向高地址擴展數據結構