1.?數據類型的用途
數據類型的本質:固定大小內存塊的別名
b 和 &b 地址相等
b+1 (跳4字節) 和 &b+1 (跳數組長度字節)
b和&b所代表的數據類型不一樣 --?b代表的數組首元素的地址 --?&b代表的是整個數組的地址
2.變量的本質:內存標號?
3. 內存四區 -- 堆,棧,全局區(常量區),代碼區
4. 函數調用模型:
5. 指針是一種數據類型,是指它指向的內存空間的數據類型。
指針的步長,根據所指內存空間類型來定。
1. 野指針:
<1> 指針變量 和 它所指向的內存空間變量是兩個不同的概念。
<2> 釋放了指針所指的內存空間,但是指針變量本身沒有重置為NULL。
Solution:
<1> 定義指針的時候,初始化成NULL。
<2> 釋放指針所指向的內存空間后,把指針重置為NULL。
2. sizeof() ?&& ?strlen()
3. buf[]直接入棧,*p1指向對應常量區“xxx”,*p2指向malloc出的堆區塊。
4. 兩頭堵算法 + 兩指針字符串翻轉 + 遞歸字符串翻轉
5. 指針輸入和輸出:
輸入:主調函數分配內存,被調函數使用。
輸出:被調函數分配內存,結果通過指針做函數參數,主調函數使用。
Tip: C風格字符串有‘\0’
6. 二級指針三種內存模型
<1> 第一種內存模型:--? //指針數組 ?char *p[] ?-- ?p[i] + *(p+i)?
打印 + 排序 ?- ?(交換的是地址)(指針的值)
<2> 第二種內存模型:--? //二維數組? char p[10][30]
打印 + 排序 – (交換的是內存塊) - strcpy
<3> 第三種內存模型:-- ?char **p2 = (char **)malloc(sizeof(char *) *10);
i. ?打印 + 排序 - (交換的是地址)(指針的值)
ii. ?打印 + 排序 - (交換的是內存塊) - strcpy
1. 兩指針挖字符串,輸入輸出方法 – 二級指針最復雜場景 ---- 非常重要,尤其判斷細節
2. 多維數組的本質 ?-- ?數組的指針
<1> 二維數組在內存中是線性存儲的。
<2> Memset(c, 0, sizeof(c))
3. 定義數組類型:
<1> 數組類型 (元素類型 和 數組大小決定)
typedef ?int ?(Myarray)[10];
Myarray ?myarray;
<2> 數組指針類型
typedef ?int ?(*PMyarray)[10];
<3> 數組指針變量
i. ?Myarray ?*myarrayPointer;
ii. ?PMyarray ?*parray;
iii. ?int ?(*PMyarray)[10];
?
4. 結構體
定義 + 初始化
5. t1.age = 10;? p->age = 10;
.是尋址操作,計算age相對于t1變量的偏移量 ?-- ?在CPU中進行,沒有操作內存
6. 結構體做函數參數 ?-- ?代碼
Teacher ?array[3]
Teacher ?*pArray;
7.?結構體套一級指針?-- ?加char *name
要分配內存,釋放內存。每個節點!!!
8.?結構體套二級指針:
嵌套分配內存,嵌套釋放內存。
1.淺拷貝:
結構體套一個一級指針或二級指針,
編譯器默認只會把指針變量的值copy,不會copy指針變量所指向的內存空間。
2.?結構體中的偏移量:
一旦結構體定義了,則結構體中的成員,內存布局就確定了,可以通過age地址,求大結構體的內存地址。
3.?文件的操作 ?-- ?讀寫磁盤
1. SocketClient動態庫函數 ?-- 代碼
<1> __declspec(dllexport)
<2> 將上層傳遞來的buf,緩存在socketClient的SCK_HANDLE結構體中。
<3> memwatch實現思路有趣