1 第 6 章 指標 6-1 指標簡介 6-2 指標與陣列 6-3 動態配置記憶體 6-4...
Post on 18-Dec-2015
233 views
TRANSCRIPT
4
宣告指標變數
指標變數,就是一種用來儲存記憶體位址的變數,當指標變數指到目標位址後,可以透過程式移動指標 ( 包括將指標變數值做數值運算 ) ,即可取得該位址所代表記憶區塊的資料值。
指標變數宣告方式如下: 資料型態 * 指標名稱 ; /* 第一種宣告方式 */
5
指標屬於系統低階的存取功能
透過指標可以存取記憶體中所指到的記憶區塊內容。
賦予指標錯誤的位址,而該位址又剛好為系統資料儲存的記憶區塊,此時若覆寫 (override) 該區塊內容,很可能造成系統不穩定或是當機的情形。
7
指標變數與指定運算 (=) 的相關示範: CH06_3
程式範例是說明兩個指標變數指向同一位址的指定運算 (=) 與相關資料內容間的變化。
重新設定指標變數的資料內容後,指向同一位址的變數內容也會隨之改變。
8
指標運算
對於一般變數而言,當使用 + 運算子或 - 運算子來進行運算時,只會做變數本身數值的增減變化。
指標變數雖然是一種用來儲存位址值的變數,也可以針對指標使用 + 運算子或 - 運算子來進行運算,不過運算結果與一般變數就大不相同了。
13
雙重指標的說明與相關示範: CH06_5
程式範例相當簡單,主要是說明雙重指標的宣告與使用,觀念就在表示除了 ptr1 是指向 num 的位址,則 *ptr1=10 。
ptr2 是指向 ptr1 的位址,因此 *ptr2=ptr1 ,而經過兩次「反參考運算子」的運算後,得到 **ptr2=10 。
16
陣列與指標常數的運算說明與示範: CH06_7
程式範例是說明陣列與指標常數間的替代運算,並示範以兩種指標方式來存取陣列內的元素值。
在使用指標常數表示法時,陣列名稱上加 1 表示位移一個記憶體單位,而這個位移量與所宣告的資料型態有關。
19
指標變數與一維陣列的運算說明與示範:CH06_9
程式範例中已經定義好 iArrVal 陣列,並宣告一個指標變數來指向該陣列第一個元素的位址,另外透過反參考運算子「 * 」來間接存取陣列內的元素值。
20
指標與多維陣列
記憶體是線性構造,因此例如二維陣列,其於記憶體中也是以線性方式配置陣列的可用空間,當然二維陣列的名稱同樣也可以代表第一個元素的記憶體位址。
二維陣列具有兩個索引值,表示二維陣列利用兩個值來控制指定元素相對於第一個元素位移量,為了方便筆者說明,請看以下這個宣告: int arr[3][5];
23
指標常數
二維陣列是佔用連續記憶體空間,當然也可藉由指標變數指向二維陣列的起始位址來取得陣列的所有元素值。宣告方式如下: 資料型態 指標變數 =& 二維陣列名稱 [0][0]; /* 二
維陣列名稱須為已定義且資料型態與宣告指標變數相同的陣列。 */
27
指標與字串
字串其實是由字元陣列組成,不過須要在字元陣列的後面加上空字元‘ \0’ 。
字串也可以經由指標來宣告與操作。例如在 C 程式中可以利用字串指標變數來指向字串常數,宣告格式如下: char * 指標變數 ="字串內容 ";
29
字元陣列或指標宣告字串的說明與示範:CH06_12
程式範例分別示範字元陣列或指標宣告字串的方式,並進行字串指標的加法運算。
最大的重點是 Name 為指標常數 , 不可改變其值,而 p_N 指標變數 , 可改變其值。
30
指標陣列
指標陣列中的元素都是一個指標變數,而元素值則為指向其它變數的位址值。
J u s t i n i a n \0
M o m o \0 \0 \0 \0 \0 \0
B e c k y \0 \0 \0 \0 \0
B u s h \0 \0 \0 \0 \0 \0
34
動態配置記憶體
方式與比較項目 動態配置 靜態配置記憶體配置 執行階段。 編譯階段。記憶體釋放 程式結束前必需釋放配置的空
間,否則造成記憶體缺口。不需釋放,程式結束時自動歸還系統。
程式執行效能 較慢。 (因為所需記憶體必需於程式執行時才能配置 )
較快。 (程式編譯階段即已決定記憶體所需容量 )
指標遺失配置位址 若指向動態配置空間的指標,在未釋放該位址空間前,又指向別的記憶體空間時,則原本所指向的空間將無法被釋放,而造成記憶體缺口。
沒有此問題。
35
動態配置變數
配置變數的方式,也就是在執行階段時,依照資料型態來動態配置一個記憶體空間,並將配置空間位址傳回指派的指標變數。
這個資料型態範圍除了 C 的基本資料型態外,也可以包括如結構 (structure) 等自訂資料型態: 資料型態 * 指標名稱 =( 資料型態 *)malloc(sizeo
f( 資料型態 ));
37
動態配置一般變數的說明與示範: CH06_15
程式範例是動態配置一個整數記憶體空間並輸入該整數數值,再列印出所指向的記憶體位址。
最後利用 free()函數釋放空間及列印出所指向的位址與內容。
38
動態配置陣列
動態配置陣列方式與動態配置變數相當類似,宣告後會在記憶體中自動尋找適合的連續記憶體空間,其長度須與指定資料型態再乘以陣列長度相符。
配置完成後,再將該記憶體區段的起始位址,傳回等號左邊所宣告的指標變數。
40
配置多維陣列
是從第一維開始,所配置的記憶體都是用來記錄下一維的陣列起始位址,只有最後一維才是真正儲存所指定資料內容的記憶體空間,若釋放時由第一維開始釋放,這樣將失去指向下一維的指標變數 ( 記憶體位址 ) 。
在釋放記憶體時必須將順序反過來,也就是由第 n 維逐步釋放至第一維。
45
動態配置各維不同長度的二維陣列的說明與示範: CH06_20
試著將原來存放在陣列中的 4 個字串,動態配置各維不同長度的二維陣列,並分別配置第一維所對應的第二維長度來儲存字串,並計算出每個字串真正所佔用的位元組。