菜鳥程式設計 指標初步

2021-08-13 19:26:28 字數 1346 閱讀 8057

這裡,筆者想分享一點關於指標和動態記憶體分配的內容。

在分享之前,筆者先簡單分享一下各個記憶體區域及他們的儲存內容。

全域性命名空間,儲存全域性變數

自由儲存區(也稱為堆),也是與動態記憶體分配相關的內容,需要用new和delete關鍵字來操作。

暫存器(cpu內部工作使用),一般不能直接使用,可以用register來定義,如:register int x,但如果暫存器不能儲存,那麼會自動轉為自動變數,存在棧裡。

**空間,儲存**

堆疊(也稱為棧),用於儲存區域性變數與函式引數。

動態記憶體分配:

c++的動態變數的建立需要關鍵字new,可以建立乙個簡單變數或是乙個陣列。如: new int x, new int[10]。

這個操作在堆的區域中申請一塊空間。但是由於堆的空間也是有限的,所以需要檢查是否成功申請到空間,這裡需要用到cassert。

例如:#include

#include

using namespace std;

int main()

int *p = new int;

assert(p != 0);

*p = 20;

cout << *p;

delete p;

p = null;

return 0;

這裡assert()給它乙個引數,就是乙個為true的表示式,如果不是true,那麼就會發出乙個錯誤訊息,然後程式終止。

對於建立的乙個一維陣列,int *p = new int[10]; p指向的是這個陣列的首位址,也就相當於乙個陣列名字。

動態的陣列和靜態的陣列乙個很大的差別就在於,動態陣列的規模可以是程式執行中某乙個變數的值甚至是乙個表示式的執行結果。而普通陣列必須要在編譯時就能確定下來。

int *p = new int[2*m+n]; 是正確的,但不能寫 int p[2*m+n];

關於上面**的delete關鍵字,它是用於**動態變數。如果乙個全域性函式中申請了乙個int *p = new int,那麼這個函式執行完之後,仍然可以在其他的函式中用p來訪問這塊空間。所以需要它「死掉」的時候,需要告訴它「你要死掉」,也就是需要delete。如果要delete乙個陣列,那麼需要寫成 delete 指標變數名。之所以在delete 之後又將p賦值為空指標,是因為delete 指標p後,指標p沒有指向的位址,也就是它是乙個迷途指標。這是很危險的。

關於記憶體洩漏:

記憶體洩漏是用動態變數申請機制申請了乙個變數,而後不需要這個變數的時候,又沒有delete 它,或者是,這個指標沒有delete之前,又將它指向了另外乙個位址,原先的資料就找不到了。這樣的情況應該盡量避免。

以上是筆者對動態記憶體分配的簡單分享,如果有出問題的地方,還請指明更正,謝謝!

菜鳥程式設計 指標初步

筆者想在此分享一下自己最近學習的指標相關的內容。指標是什麼?指標就是記憶體的乙個位址,它能夠增加變數的訪問方法,也就是說,變數不僅能通過變數名來直接呼叫,也可以通過指標來訪問。指標指向的就是這個變數所在的位址,通過訪問這個位址,來呼叫位址所儲存的變數。指標的定義與使用。int i 0 int p i...

C this指標初步使用,與鏈式程式設計

include pch.h include include using namespace std class person person addage person p void showage void test1 int main 注意這裡 person addage person p 返回的...

程式設計初步

1 乙個分支的if語句 2 if else 二分支選擇結構 多分支選擇結構 if else 兩個語句可以新增括號表示等價的潛逃匹配關係。switch 表示式 注意 1。表示式型別為整形,字元型或列舉型,不能為浮點型。2。break可使用來簡化過程。3。case的內容不能重複。4。運算子加單引號。如果...