1. 程式人生 > >《C++ Primer Plus》學習筆記——第四章 複合型別(三)

《C++ Primer Plus》學習筆記——第四章 複合型別(三)

指標與自由儲存空間

指標是一個變數,其儲存的是值的地址,而不是值的本身。對於變數可以使用(&)地址運算子來獲取地址。

顯示地址時,常用的描述記憶體的表示法是十六進位制表示法。

對於常規變數,值是指定的量,而地址是派生量。

指標名錶示的是地址。*運算子被稱為間接值或解除引用運算子,將其運用在指標上,可以得到該地址儲存的值。

宣告和初始化變數:

int* ptr;//指向int的指標
int* ptr=&higgens;//初始化

建立指標時,如果不將指標指向一個地址,是不可以賦值的。因為不知道到底將值放在何處。

new與delete:

在C語言中,可以使用庫函式malloc()來分配記憶體;在C++中仍然可以這樣做,但是還有更好的辦法——new運算子

int* p=new int;

new int 告訴程式需要儲存int的記憶體,之後p指向這個記憶體。

new從被稱為堆或自由儲存區的記憶體區域分配記憶體。

當不需要這塊由new指定的記憶體,可以使用delete來釋放記憶體;

int* p=new int;
delete p;

一般不建立兩個指向同一個記憶體塊的指標,否則可能會錯誤的釋放記憶體兩次。

用new來建立動態陣列以及釋放記憶體

int* psome=new int [10];
delete [] psome;

使用動態陣列可以像使用陣列一樣使用。

使用new和delete應遵循以下規則:

  • 不要使用delete來釋放不是new分配的記憶體
  • 不要使用delete釋放同一個記憶體兩次
  • 如果使用new []為陣列分配記憶體,就應使用delete []來釋放記憶體。
  • 對空指標用delete是安全的。

指標、陣列和指標算術

指標和陣列基本等價的原因在於指標算術和C++內部處理陣列的方式。

將指標加1,增加的量等於它指向的型別的位元組數。

可以修改指標的值(指標可運算),而陣列名是常量。

對陣列運用sizeof得到陣列的長度,而對指標用sizeof得到的是型別長度。

陣列名被解釋為其第一個元素的地址,而對陣列名應用地址運算子得到的是整個陣列的地址。

指標與字串:

C-風格字串

char* bird="wren";
cout<<bird<<endl;
//輸出的是wren;

如果給cout提供一個指標,他將列印地址,如果指標的型別為char*,則將顯示指向的字串,如果要顯示地址,就必須將這種指標型別強制轉換成另一種型別,如:int*。

用new建立動態結構:

首先建立結構,在宣告:inflatable* ps=new inflatable;

如果要訪問成員,需要使用->箭頭成員運算子:ps->price.

另一種是(*ps).price。通過優先順序,來訪問成員。

自動儲存、靜態儲存和動態儲存

自動儲存:

在函式內部定義的常規變數使用自動儲存空間,他們隨函式的呼叫產生,函式的結束而消失。

靜態儲存:

在程式執行期間一直存在。定義方式有兩種:在函式外定義或宣告時加static關鍵字。

動態儲存:

使用new和delete (最好一起用)。

陣列的替代品

模板類vector

實質是使用new和delete來管理記憶體,可在執行階段設定長度。

要使用vector物件,首先要包含標頭檔案vector,其次要有名稱空間std。

vector <typename型別>vt名(n_elem)
//n_elem可以是整型常量,也可以是整型變數

模板類array

長度固定,使用的是棧,效率與陣列一樣,但更加安全可靠。要使用array,首先包含標頭檔案array和名稱空間std。

array<int,5>ad;
array<typename,n_elem>arr;