指標 (Pointer)
指標確實是C/C++語言當中最難駕馭的技術課題,但是它同時也是讓C/C++語言成為高階語言中擁有最高效能和最大彈性的關鍵。
指標的複雜度來自它對實體記憶體位置的操作,大多數的高階語言基於系統的安全性和程式的高階抽象化設計的理念,通常都不允許對實體記憶體位置進行操作。
適當的使用指標可以讓工程師更貼近硬體(記憶體)的層次,因此將有利於設計出更節省資源、更高效能的程式。
但是有三種應用場合,使用指標仍然是必要的。第一是字串(string)的宣告;第二是動態記憶體配置(dynamic memory allocation);第三是函式的陣列傳遞。
指標變數(Pointer Variable)
指標(pointer)是一種用來指示資料存在於記憶體中的位址標示器,其宣告方式為:
資料型別 *變數名稱 ;
int *p ;
以上的宣告具有三個意義:
1、 p是一個指標變數;
2、 一旦宣告p是指標變數,則p代表一個記憶體位址,而*p代表此位址的資料內容;
3、 p所指向記憶體位址內的資料的變數型態為整數( int )。
取址運算子&
可取得任意變數記憶體位址的運算子,稱為取址運算子 ─ "&"
作為陣列名稱的指標
陣列是用來存放相同型別資料的一塊連續記憶體,也就是陣列中每一個資料的記憶體位址都是與前後資
料連續的。所以陣列名稱可當做指標來使用,例如宣告一個具有5個整數值的陣列:
int array[5]={ 1,2,3,4,5 };
array是陣列名稱,但同時也是一個指標,指向陣列的第一個位址,也就是陣列的第一個元素array[0],其元素值為1。
如果我們將array加1,表示記憶體位置加1,所以array+1便指向了元素array[1]。
作為字串名稱的指標
字串(string)是字元(char)的陣列,由於陣列名稱可以視為指標,則字串名稱同樣也可以視為指標。宣告字串有兩種方式,一種是宣告一個字元的陣列,如
char file_name[20];
file_name就是一個具有20個字元空間的陣列名稱,同時也是字串名稱,我們可以指定字串內容給它:
file_name=”data.txt”;
宣告字串的另一種形式是把字串宣告成一個指標,同時把指標指向一個字串內容,如
char *file_name=”data.txt”;
這兩種宣告的作用是一致的,但後者彈性較大,因為編譯器會視字串內容大小來配置相對的記憶體(在上例中,data.txt共8個字元,但編譯器會自動在字串的最後一個字元後面再加一個結束字元’\0’,所以一共9個字元空間)。而前者─宣告字元陣列的方式記憶體是固定為20個字元空間。
內容引用 : http://ccy.dd.ncu.edu.tw/~chen/course/Cpp/ch5/5.htm