1 內存分區:
堆:手動分配釋放,使用malloc/free,new/delete
棧:存儲函數中的參數、除堆和靜態存儲區里的,正常分配的空間都是在棧里
靜態存儲區:全局變量、靜態變量。包括全局初始化區(數據段)和全局非初始化區(BBS段),顧名思義,初始化的變量就存在數據段,非初始化的變量就存在bbs段
文字常量區:存放字符串常量,存放在文字常量區的字符串是不允許被修改的
代碼區:存放代碼
2 C風格的字符串
(1)字符串常量
(2)末尾添加\0的字符數組
c風格的字符串不等于字符數組,因為前者末尾還包括一個\0,所以string型變量“abcd”的長度為5,而char s[]={'a','b','c','d'}的長度為4
字符串處理函數:傳遞過去的指針必須是非零值,同時還應該以null結束。函數調用的時候將會從首地址開始處理,直到遇到null字符停止。
3 指針與整數的運算
+n:當前地址+n*當前指針所指的數據類型
指針相減:代表的是兩個指針在內存中的距離
數組指針:本質是一個指針,該指針指向一個數組。如int (*p)[10]。二位數組名是一個數組指針,但一維數組名不是。
指針數組:本質是一個數組,該數組中的每個元素是一個指針。如int *a[10]
4 在不同的文件中使用全局變量
(1)#include頭文件(如果將變量寫錯,則源程序在編譯的時候會報錯)
(2)extern方式引用(如果將變量寫錯,則源程序在連接的時候報錯)
5 static作用
(1)不考慮類
隱藏:加了stacic的全局變量和函數對其他的源程序是隱藏的,這樣就可以在不同的源程序中使用相同的名字命名函數和變量而不用擔心命名沖突
默認初始化為0:靜態全局變量(其實不定義成靜態的非初始化全局變量也是默認為0,因為分配的空間在BBS)和靜態局部變量默認初始化為0
保持局部變量內容持久:在函數內定義的靜態局部變量,它的生存期是整個程序的生命周期(不會隨著函數退出而消失),但是它的作用域還是局部的。
6 類static的作用
使用static定義的成員表示該成員屬于類而不是屬于類的具體對象,可以使用類名調用,也可以使用類對象調用。當某個對象修改了該靜態成員變量,其修改值為該類的其他所有實例所見。
static數據成員在類里聲明,在類外定義(即初始化分配空間)。
static函數成員里不允許訪問非static成員(包括數據和函數)
7 const比define的優點
(1) const有類型檢查
(2) 前者產生的目標代碼更小
(3) 前者可以執行常量折疊:即將常量表達式進行計算求值
8 const指針和指向const變量的指針
指向const變量的指針不允許通過指針修改該變量
9 函數不能返回指向局部變量的指針,這是因為在函數返回后它們是無效的,棧也被清理了??煞祷氐闹羔樖侵赶蚨阎蟹峙涞拇鎯臻g的指針或指向靜態村存儲區的指針。
char p[]="hello world";//數據使用的普通數組,直接在棧里分配內存存儲
static char p[]="hello world";//使用靜態數據,分配在靜態存儲區
char *p="hello world";//p是指向靜態存儲區的指針,數據存儲在靜態存儲區
char *p=(char*)malloc(12);//分配在堆里
10 函數形參是const型,可以傳遞變量;但函數形參是非const型,傳遞cosnt型會報錯。
11 android異步消息處理機制
第一,handler
第二,asynctask
12 虛函數表
編譯器會為每個有虛函數的類創建一個虛函數表,該虛函數表將被該類的所有對象共享。類的每個虛成員占據虛函數表中的一行。如果類中有N個虛函數,那么其虛函數表將有N*4字節的大小。? 虛函數(Virtual Function)是通過一張虛函數表(Virtual Table)來實現的。簡稱為V-Table。在這個表中,主要是一個類的虛函數的地址表,這張表解決了繼承、覆蓋的問題,保證其真實反應實際的函數。這樣,在有虛函數的類的實例中這個表被分配在了這個實例的內存中,所以,當用父類的指針來操作一個子類的時候,這張虛函數表就顯得由為重要了,它就像一個地圖一樣,指明了實際所應該調用的函數