你可能一直有乙個疑問,計算在儲存資料時如何跟蹤這三個屬性
下面就來看看一種策略,它以指標為基礎,指標是乙個變數,其儲存的是值的位址,而不是值本身。在討論指標之前,我們看看如何找到常規變數的位址。只需對變數應用位址運算子(&),就可以獲得它的位置。
使用常規變數時,值是指定的量,而位址是派生量。
下面來看看指標策略(c++記憶體管理程式設計理念的核心)
指標與c++基本原理一種特殊的變數——指標用於儲存值的位址。因此,指標名表示的是位址。*運算子被稱為間接值或解除引用運算子,*指標名即為該位址處儲存的值物件導向程式設計和傳統性程式設計的區別在於,oop強調的是執行階段(而不是決策階段)進行決策:即在程式正在執行時。執行階段決策好比度假時,參觀景點取決於你的心情和天天氣,決策階段決策好比不管在什麼條件下,都堅持預先的安排。
執行階段決策提供了靈活性。例如,在宣告陣列時如果一開始就將陣列長度定為20,但程式有時需要處理200個元素,但是宣告200長度的陣列又浪費了記憶體。oop通過將這樣的決策推遲到執行階段進行,使程式更靈活。在執行後,可以這次告訴它需要20個元素,下次告訴它需要200個元素。
為使用這一種方法,語言必須在執行時建立陣列。在c++中使用關鍵字new請求正確數量的記憶體以及使用指標來跟蹤新分配的記憶體位置。
int updates=6;
int* p_updates;
p_updates =
&updates;
int變數update和指標變數p_updates只不過是一枚硬幣的兩面。變數updates表示值,並使用&運算子獲得位址;變數p_updates表示位址,並使用*p_updates運算子獲得值
int
* pt;
pt =
0xb8000000
;//不行,因為右邊是整數型別
pt =
(int*)
0xb8000000
;//可以,左右兩邊都是整數的位址
指標真正的用武之地在於,在執行階段分配未命名的記憶體以儲存值。在這種情況下,只能通過指標來訪問記憶體。
接下來用new運算子為乙個int值分配未命名的記憶體,並使用指標來訪問這個值。程式設計師要告訴new,需要為哪種資料型別分配記憶體;new找到乙個長度正確的記憶體塊,並返回該位址賦給指標。
int
* pn =
newint
;
int higgens;
int* pt =
&higgens;
第一種情況,只能通過該指標進行訪問。第二種情況可以通過名稱higgens來訪問該int
最後用delete來釋放記憶體,會釋放指標指向的記憶體,但不會刪除指標本身,可以將指標重新指向乙個新分配的記憶體塊。需要與new配對使用。不能用delete釋放宣告變數所獲得的記憶體
int
* psome =
newint[10
];//delete psome;
new返回第乙個元素的位址,然後將位址賦給指標
使用動態陣列
上述指標psome指向10個int值的記憶體塊中的第乙個元素。可以將其看做一根手指。假如int佔4位元組,將手指沿正確方向移動4個位元組,手指會指向第二個元素。而手指的移動範圍就是這10個元素。
那麼問題來了,如何訪問其中的元素呢。第乙個元素就是*psome。
另外的元素可以把指標當做陣列名用即可,第乙個元素psome[0],第二個psome[1]…
但是陣列名和指標還是有著根本的差別
double
* p3 =
newdouble[2
];p3[0]=
0.1;
p3[1]=
0.2;
cout<
cout<<不能修改陣列名的值,但指標是變數,可以修改它的值。
C指標初識
指標是乙個變數,其值為另乙個變數的位址,即,記憶體位置的直接位址。就像其他變數或常量一樣,您必須在使用指標儲存其他變數位址之前,對其進行宣告。指標變數宣告的一般形式為 type var name 在這裡,type是指標的基型別,它必須是乙個有效的 c 資料型別,var name是指標變數的名稱。用來...
C 初識指標
定義乙個指標指向乙個變數的位址 type p var int i int p i 通過 p讀寫i的值 p 10 int a p 用乙個指標指向另乙個指標的位址,不管幾級指標都是指標.type q p char p abc char q p 讀取二級指標的值 printf s n q 等價於 prin...
初識C指標
什麼是指標?type var name int a 乙個整型的指標 double b 乙個 double 型的指標 float c 乙個浮點型的指標 char ch 乙個字元型的指標 所有實際資料型別,不管是整型 浮點型 字元型,還是其他的資料型別,對應指標的值的型別都是一樣的,都是乙個代表記憶體位...