1.可變數(shù)組
C 語言數(shù)組大小固定,無法改變。
考慮用 C 語言實(shí)現(xiàn)一個可以變大小的 int 數(shù)組:可成長,能得到大小,能訪問元素。
可以實(shí)現(xiàn)一個函數(shù)庫,定義數(shù)組所需的函數(shù):創(chuàng)建,回收,大小,訪問元素,成長。
函數(shù)庫
2.定義可變數(shù)組
可變數(shù)組定義
習(xí)慣定義為 *Array ,Array 為指針。這時無法定義本地變量,不要定義指針類型??!
3.創(chuàng)建 Array (array_create(int size))
創(chuàng)建可變數(shù)組函數(shù),返回Array
為什么不返回指針?因?yàn)?a 是本地變量,返回指針的話在函數(shù)結(jié)束后本地變量消失,指針無效。
為什么不直接 malloc 結(jié)構(gòu)的 size ? 會使得使用困難。傳入指針返回指針有風(fēng)險。
4.回收 Array(array_free(Array *a))
回收可變數(shù)組,無返回值。
5.得到 Array 大小(array_size(const Array *a))
得到數(shù)組大小,返回 int
封裝得到數(shù)組大小的方法,保護(hù)內(nèi)部實(shí)現(xiàn)細(xì)節(jié),之后升級可以集中改動。
6.訪問元素(array_at(Array* a,int index))
訪問數(shù)組元素,返回指向數(shù)組元素的指針
可以通過 *array_at(&a,0)=10 做賦值,做左值把值寫到數(shù)組里,也可以做右值賦值給左值。
可用 array_get() 和 array_set() 兩個存取函數(shù)代替 array_at()
可用array_get得到數(shù)組中元素的值,array_set設(shè)置數(shù)組中元素的值
7.內(nèi)存塊?memory in block
const int BLOCK_SIZE = 20;
考慮index越界的情況
可自動增長,每次漲 BLOCK_SIZE 個單元。
8. Array 的成長(array_inflate(Array *a,int more_size))
成長more_size個單元,找一片新的空間復(fù)制原來的數(shù)組,刪除原數(shù)組。無返回值
分配新空間,復(fù)制原數(shù)組到新空間,可用memcpy替換。