記憶體
c++記憶體模型為:**區、靜態區、棧區、堆區、常量區。指標就是記憶體位址,因此只要在記憶體中的,指標都可以指向,也就是說指標可以指向**區、靜態區、棧區、堆區、常量區。c++指標可以指向c++中的任何變數。指標即定址方式為間接定址,可以有二級指標、**指標。。。。,級數受記憶體大小限制。
指標中存放的是記憶體位址,所以指標本身是沒有資料型別的,而c++中可以有整形指標、字串指標等不同型別的指標。目的在於指定讀取存放的記憶體位址中的資料時記憶體長度,假設整形(4位元組)指標,讀取記憶體資料時,從指向的起始位址開始,讀取整形的記憶體長度為四位元組。
c++中指標型別可以強制轉換, 指標在c++中佔的記憶體大小是固定的與其型別無關。
空指標
標準並沒有對空指標指向記憶體中的什麼地方這一問題作出規定,也就是說用哪個具體位址值表示空指標取決於系統實現。我們常見的空指標一般指向0位址,即空指標的內部用全0來表示(zero null pointer,零空指標);也有一些系統用一些特殊的位址值或者特殊的方式表示空指標(nonzero null pointer,非零空指標),具體參見 c faq。注意:不要把空指標的內部實現表示等同於整數0的物件表示——如上所述,有時它們是不同的。
實際上空指標的0位址並不是物理記憶體的開端的0位址,這與作業系統的記憶體機制有關,windows系統會給程式分配一段專屬的記憶體區域,該程式的相關資源均執行在該記憶體區,所以程式空指標指向的實際上是該段記憶體的起始位址,也就是說不同程序的空指標指向的物理記憶體位址其實是不同的,雖然他們邏輯上都指向0位址。
空指標賦值分割槽是程序的位址空間中從0x00000000 到 0x0000ffff 的閉區間(64k 的記憶體大小),這 64k 的記憶體是一塊保留記憶體,不能被程式動態記憶體分配器分配,不能訪問,也不能使用,保留該分割槽的目的是為了幫助程式設計師捕獲對空指標的賦值。如果程序中的執行緒試圖讀取或者寫入位於這一分區內的記憶體位址,就會引發訪問違規。
歸根結底,程式中所使用的資料都需要從物理裝置上獲取,即程式中的資料需要從乙個真實的實體地址中讀取或者寫入。所以當乙個指標的邏輯位址可以通過計算能夠準確無誤的對映到乙個正確的實體地址上時,這時候資料的訪問就是正確的,程式的執行也沒有任何問題。如果乙個指標為空指標,那麼該指標所指向的邏輯位址空間位於空指標賦值分割槽的區間上。空指標賦值分割槽上的邏輯位址沒有物理儲存器與之對應,因而訪問時就會產生違規訪問的異常。
野指標
野指標是指向不合法記憶體的指標。
野指標的出現有三種情況:初始化時未賦初值、指標被free或delete後沒有及時指標本身、指標指向臨時變數,訪問越界。初始化時指標的預設值是隨機的,所以未賦初值會導致指標指向不可**的記憶體,導致程式產生意想不到的錯誤;指標所指向的記憶體位址資料被釋放掉後,指標依然指向該記憶體;指向臨時變數的問題原理上同上;指標運算元組時由於c++的陣列沒有越界檢查,因此很容易訪問越界訪問到了不該訪問的記憶體區域
關於C 成員函式指標的一些探索
這幾天看 深入探索c 物件模型 遇到乙個問題,思考了好久,是關於成員函式指標的。看下面這段 class base virtual void y class derived public base virtual void y override int main 其在visual studio2013...
C 二) 對陣列指標以的探索
include using namespace std int main int array 10 int i 1 int size sizeof int cout array i 的指標 array 1 endl cout array 我們的目的是觀察以下指標的值 1,array 1 的指標 2,...
void及void指標深層探索
void指標型別 ansi c標準規定用動態儲存分配函式時返回void指標,它可以用來指向乙個抽象的型別的資料,再將它的值賦給另一指標變數時要進行強制型別轉換使之適合於被賦值的變數的型別,如 char p1 void p2 p1 char p2 或 p2 void p1 也可以將乙個函式定義為voi...