2012年6月30日 星期六

基本 C 語言指標 (Pointer) 使用

基本 C 語言指標 (Pointer) 使用:

C 語言來寫程式已有一段時間,但使用指標 (Pointer) 來編寫C時,總覺有點虛 (筆者仍是初學者),因為指標的變化比較多,還有點抽象!

  

在程式中宣告 (Declare) 變數 (Variable) 後,例如 int a 在程式中可直接使用這變數 (Variable) 來做運算或儲存資料,而不需要知道變數 a的儲存位址。指標 (Pointer) 是儲存記憶體位址的資料型態,當宣告 (Declare) 後會配置一塊 4 bytes的記憶體空間,有時用指標 (Pointer) 來處理會比較簡潔,便需要用儲存位址作為參數。用 & (取址運算子 Address-of operator) 取得變數的位址,用 * 間接參考指使用指標取得某個記憶體的內容。

範例
描述
Description
int a;
一個整型數
An integer
int *a
一個指向整型數的指標
A pointer to an integer
int **a;
一個指向指標的的指標
A pointer to a pointer to an integer
int a[10];
一個有10個整型數的陣列
An array of 10 integers
int *a[10];
一個有10個指標的陣列
An array of 10 pointers to integers
int (*a)[10];
一個指向有10個整型數陣列的指標
A pointer to an array of 10 integers
int (*a)(int);
一個指向函數的指標
A pointer to a function a that takes an integer argument and returns an integer
int (*a[10])(int);
一個有10個指標的陣列,指向一個整形函數並有一個整形參數
An array of 10 pointers to functions that take an integer argument and return an integer

範例
描述
p = &a;
&a是取a的地址 (沒有&的話就變成取a的內容)
b = *p; 
b的值被設定為指標p所指到記憶體的值 (沒有*的話就變成取p的內容,而不是透過p去取a的內容了)
*p = 0;
透過pa的值被設定為0
p = &c;
指標p現在指向c
*p = *p + 10;
透過p把某記憶體 (現在是c) 的值增加10
y = *p + 1; 
透過p取某記憶體的值 (現在是c) 1之後,把結果存入y
++*p;
指標p所指到的記憶體上1,這是因為++*優先權同樣為2,右結合,因此*先做,再做++

範例:


int a = 88
int *aPointer                    // int *aPointer = &a
aPointer = &a;

prinf(“%d”, a);                 // 結果 : printf 顯示 a 88
printf( “%d”, *aPointer);   // 結果 : printf 顯示 *aPointer 88
prinf(“%p”, &a);              // 結果 : printf 顯示 &a 104
prinf(“%p”, aPointer);     // 結果 : printf 顯示 aPointer 104


當宣告變數 a 整數值為 88,編譯器將變數 a 放在 104 的記憶體位址,然後再宣告指標變數 aPointer指向 a ,假設編譯器 aPointer 放在 108 的記憶體位址裡,如下圖所示:


2012 6 30 天氣報告
氣溫:27.5 @ 22:10
相對濕度:百分之91%
天氣:微雨

2 則留言: