所有的變數使用到這一點,在本教程中有乙個共同點:該變數必須先宣告在編譯的時候。
這導致了兩個問題:第一,很難有條件地宣告乙個變數,把它在乙個if語句塊之外(在這種情況下,它會超出範圍時,塊的結束)。
第二,所有陣列的大小必須決定在執行程式之前。例如,
以下是不合法的:1
2
3
4
5
cout <<
"how many variables do you want? "
;
int
nvars;
cin >> nvars;
int
anarray[nvars];
// wrong! the size of the array must be a constant
然而,在許多情況下,它會有用能的大小或調整陣列並正在執行的程式。例如,我們可能需要使用乙個字串,牽著別人的名字,但我們不知道多久,他們的名字是直到他們進入它。我們可能要在數的記錄從磁碟讀取,但我們事先不知道有多少記錄。或者我們可以建立乙個遊戲,乙個怪物追逐的球員數量可變的。
如果我們不得不宣布一切大小在編譯的時候,我們所能做的就是盡力猜測的最大數量的變數,我們需要和希望的,足夠的:
1
2
3
char
szname[25];
// let's hope their name is less than 25 chars!
record asrecordarray[500];
// let's hope there are less than 500 records!
monster asmonsterarray[20];
// 20 monsters maximum
這是幾個原因不能解決。首先,它會導致浪費記憶體如果變數實際上並沒有用。例如,如果我們分配25個字元每名稱,但名稱平均只有12個字元長,我們分配在兩次,我們真正需要的!第二,它可以導致人為的限制和/或緩衝區溢位。當使用者試圖在600個記錄從磁碟讀取?因為我們只分配了500的空間,我們可以給使用者乙個錯誤,只看前500條記錄,或(在最壞的情況下,我們根本沒有處理這種情況),我們的記錄,我們的程式緩衝區溢位崩潰。
幸運的是,這些問題是容易解決的問題,通過動態記憶體分配。動態記憶體分配允許我們將任何大小的記憶在我們需要的時候我們需要它。
單變數的動態分配
分配乙個單變數的動態,我們使用標量(非陣列)的新的運算元形式:
1
int
*pnvalue =
new
int
;
// dynamically allocate an integer
新的操作返回的變數被分配了位址。
可以將該位址
儲存在乙個指標,
指標解引用
,然後可以
訪問變數
。
傳指標and解引用
乙個函式的改變要影響另乙個函式需要兩個條件 1 傳指標。2 解引用。通過交換a和b數值的例項來說明其重要性 在主函式中輸入a和b的值 int a 10 int b 20 預期輸出結果為a 20 b 10。明顯與預期結果不符。原因 沒有傳指標!具體操作為 也與預期結果不符。原因 沒有解引用。與預期相符...
函式指標的解引用
宣告函式的引用 int f double int const pf double f pf是指向函式f 的常量指標 int rf double f rf是函式f 的引用 從編碼實踐角度來看,指向函式的常量指標和函式的引用並無很大不同。除了一點,那就是指標可以顯式地使用反引用語法,而對引用是不能使用顯...
關於C中指標的引用,解引用與脫去解引用
在指標操作中的意義 1 大家都知道在寫int p 時,可以宣告乙個指標。很少人知道 在c c 中還有乙個名字就是 解引用 他的意思就是解釋引用,說的通俗一點就是,直接去尋找指標所指的位址裡面的內容,此內容可以是任何資料型別,當然也可以是指標 這就是雙重指標,後面將會討論 需要注意的是,在變數宣告的時...