第4章 陣列和指標 8

2021-06-01 20:03:49 字數 2119 閱讀 7538

4.3.1 建立動態陣列

陣列型別的變數有三個重要的限制:陣列長度固定不變,在編譯時必須知道長度,陣列只在定義它的塊語句內存在。

雖然陣列長度是固定的,但動態分配的陣列不必在編譯時知道其長度,可以(通常也是)在執行時才確定陣列長度。與陣列變數不同,動態分配的陣列將一直存在,直到程式顯式釋放它為止。

每乙個程式在執行時都占用一塊可用的記憶體空間,用於存放動態分配的物件,此記憶體空間稱為程式的自由儲存區或堆。c語言程式使用一對標準庫函式malloc和free在自由儲存區中分配儲存空間,而c++語言則使用new和delete表示式實現相同的功能。

1. 動態分配陣列時,只需指定型別和陣列長度,不必為陣列物件命名,new表示式返回指向新分配陣列的第乙個元素的指標。

int* i = new int[10];

new表示式需要指定指標型別以及在方括號中給出的陣列維數,該維數可以是任意的複雜表示式。建立陣列後,new將返回指向陣列第乙個元素的指標。在自由儲存區中建立的陣列物件是沒有名字的,程式設計師只能通過其位址間接地訪問堆中的物件。

2. 初始化動態分配的陣列

動態分配陣列時,如果陣列元素具有類型別,將使用該類的預設建構函式實現初始化;如果陣列元素是內建型別,則無初始化。

int* i = new int[10];       //uninitinalized

string* j = new string[10]; //initinalized

也可使用跟在陣列長度後面的一對空圓括號,對陣列元素做值初始化。

int* i = new int[10]();       //initinalized

for(int *j = i, *last = i + 10; j!= last; j++)

對於動態分配的陣列,其元素只能初始化為元素型別的預設值,而不能像陣列變數那樣,用初始化列表為陣列元素提供各不相同的初值。

3. const物件的動態陣列

如果我們在自由儲存區中建立的陣列儲存了內建型別的const物件,則必須為這個陣列提供初始化。

const int *arr = new const int[10]();
c++允許定義類型別的const陣列,但該類型別必須提供預設建構函式。

const string *i = new const string[10];
因為已建立的常量元素不允許修改——因此這樣的陣列實際上用處不大。

4. 允許動態分配空陣列

呼叫new動態建立長度為0的陣列是合法的。

const string *i = new const string[0];
用new動態建立長度為0的陣列時,new返回的有效的非零指標。該指標與new返回的其他指標不同,不能進行解引用操作,因為它畢竟沒有指向任何元素。

5. 動態空間的釋放

動態分配的記憶體最後必須進行釋放,否則,記憶體最終將會逐漸耗盡。如果不再需要使用動態建立的陣列,程式設計師必須顯式地將其占用的儲存空間返還給程式的自由儲存區。c++語言為指標提供delete 表示式釋放指標所指向的陣列空間。

const string *i = new const string[0];

delete i;

理論上,**陣列時,缺少空括號對,至少會導致執行時少釋放了記憶體空間,從而產生記憶體洩漏(memory leak)。對於某些系統和/或元素型別,有可能會帶來更嚴重的執行時錯誤。因此,在釋放動態陣列時千萬別忘了方括號對。

6. 動態陣列的使用

通常是因為在編譯時無法知道陣列的維數,所以才需要動態建立該陣列。

const char *i = "12345";

int len = strlen(i) + 1;

char *j = new char[len];

strncpy(j, i, len);

for(char *k = j, *l = j+len; k != l; k ++)

標準庫函式strlen返回的是字串的長度,並不包括字串結束符,在獲得的字串長度上必須加1以便在動態分配時預留結束符的儲存空間。

第4章陣列和指標

陣列的定義和初始化 注意 1.顯示初始化陣列元素 在函式體外定義的內建陣列,其元素均初始化為0 在函式體內定義的內建陣列,其元素無初始化 不管陣列在 定義,如果其元素為類型別,則自動呼叫該類的預設建構函式進行初始化,如果該類沒有預設建構函式,則必須為該陣列的元素提供顯式的初始化。2.特殊的字元陣列 ...

C和指標 第8章 陣列

1.2 2 arry arry 2 arry 2 1.3下標絕不會比指標更有效率,但指標有時會比下標有效。結論 1.當根據某個決定數目的增量在乙個陣列中移動的時候,使用指標比使用下標產生效率更高的 當這個增量是1並且機器具有位址自動增量模型時,這點表現更突出。2.宣告為暫存器變數的指標通常比位於靜態...

c primer 第4章 陣列和指標

避免使用未初始化的指標 對指標進行初始化或賦值只能使用以下四種型別的值 把int型變數賦給指標是非法的,儘管int型變數的值可能為0.但允許把數值0或在編譯時可獲得0值的const量賦給指標。3.void 指標 c 提供了一種特殊的指標型別void 它可以儲存任何型別物件的位址 void 指標只支援...