空指標 void 指標 new及delete

2021-06-27 20:14:02 字數 1491 閱讀 3669

如題分別總結這些和指標有關的一些知識點

1. 指向任意型別的指標void*

很多人誤以為void*型別的指標就是空指標,這是不對的。void*型指標,表示定義乙個指標,但不指定它指向那種型別的資料。void*型別的指標作為一種通用的指標,可以和其他任何型別的指標(函式指標除外)相互轉化而不需要型別強制轉換,但不能對它進行解引用及下標操作。

也就是說宣告了乙個void*型別的指標後,可以把任意型別的資料位址賦給該指標,但並不改變該指標的void*型別。要通過解引用訪問void*指標指向的資料,就必須要先把void*指標強制轉換成指向的資料型別的指標,然後再解引用訪問資料。這是因為void*指標並不知道指向的資料型別的長度,所以不能直接訪問資料。

第二點,如果宣告了乙個void*指標而沒有初始化,那麼該指標指向的位址是未知的,而不是null。

2. 空指標

空指標就是指向空位址的指標,空指標的值為0或null(可參照下面程式的執行結果),這個指標值對任意型別的指標都是合法的。也就是說任意型別的指標都可以初始化或置為空指標。空指標表示該指標目前處於閒置狀態,沒有指向任何有意義的東西。另外,空指標雖然指向「空」,但它本身作為乙個資料型別的單位,是要占用記憶體空間的。

3. 野指標

沒有初始化,並且不知道指向位址的指標就是野指標。由於野指標指向的位址未知,因此對野指標指向的位址進行寫操作有可能發生未知的錯誤,這是非常危險的。在vs2010平台下,經過我的實驗,對野指標進行訪問也是非法的。以後使用指標一定要記住賦初值或在程式中賦值,否則很可能出現一些意想不到的結果。

4. new和delete

c++的動態記憶體分配使用new關鍵字,具體用法為:

typename* pt = new typename; 或者對於陣列:

typename* ps = new typename [arsize];

new關鍵字告訴編譯器找到一塊長度合適的記憶體塊,返回首位址賦值給指標pt。該記憶體塊儲存的值由指標pt訪問。

為了防止記憶體洩露問題出現,需要使用delete運算子來釋放使用完的記憶體:

delete pt; 對於陣列:

delete pt;

需要注意的是使用delete釋放記憶體後,編譯器分配給指標的記憶體被釋放,但是指標指向的位址並不會被改變,並且這個位址仍可以被指標訪問到!比較保險的做法是,釋放完記憶體後,將指標置位空:pt = null,這似乎是沒有區別的,但是對於一些複雜的需要大量判斷的程式來說卻有極大的好處,例如下述程式塊:

int* pt = new int [10];

...if(pt != null)

...

這樣避免了重複釋放記憶體塊的危險。

下面乙個程式驗證了空指標值,被釋放後的指標值是否變化,以及釋放記憶體後指標指向的記憶體仍可以被訪問到。

注:宣告的pt、ps指標都需要初始化,否則被cout訪問報錯。

#include using namespace std;

int main()

執行結果:

空指標和void 指標

空指標不指向任何物件,在試圖使用乙個指標之前可以檢查它是否為空。以下列出幾個生成空指標的方法 int p1 nullptr int p2 0 int p3 null 得到空指標最直接的辦法就是用字面值nullptr來初始化指標,這是c 11新標準引入的一種方法。nullptr是一種特殊型別的字面值,...

空指標和void 型別指標

今天,有個師弟問我 師兄,空指標和void 型別指標是怎樣的?當時,我大概的說法是 1 空指標是沒有指向的指標,將暫時用不到的指標定義成空指標,能防止誤用。2 而void 型別的指標是有指向的指標,但它的指向的資料的型別暫時不確定,所以先弄成void 型別,後期一般要強制轉換的。回來後,發現這種說法...

void及void指標型別

1.概述 許多初學者對c c 語言中的void及void指標型別不甚理解,因此在使用上出現了一些錯誤。本文將對void關鍵字的深刻含義進行解說,並 詳述void及void指標型別的使用方法與技巧。2.void的含義 void的字面意思是 無型別 void 則為 無型別指標 void 可以指向任何型別...