C++ 入門指南 - 指標與參考

指標 (pointer) 儲存變數 (variable) 的記憶體位置,參考 (reference) 則是變數的別名 (alias)




宣告 (declare) 指標變數使用星號運算子,舉例如下
#include <iostream>

using namespace std;

int main(void)
{
    int n = 11;
    cout << n << endl;
    
    int *nPter = &n;
    cout << nPter << endl;
    
    int t = *nPter;
    cout << t << endl;
    
    return 0;
}

/* 《程式語言教學誌》的範例程式
    http://pydoing.blogspot.com/
    檔名:pointerdemo.cpp
    功能:示範 C++ 程式 
    作者:張凱慶
    時間:西元 2012 年 10 月 */


這個例子中,我們先宣告整數變數 n
int n = 11;


然後用 nPtr 取得 n 的記憶體位置。須留意 nPtr 的前面(右邊)加星號表示是指標,而這個星號運算子 * 用為宣告指標,指標的型態 (type) 必須與取得記憶體位置變數的型態相符,等號右邊則是利用取址運算子 (address-of operator) & 取得變數 n 的記憶體位置
int *nPter = &n;


下面則是利用反參考運算子 (dereference operator) ,同樣是星號 * ,但是出現在等號的右邊,由 t 取得 nPtr 所儲存記憶體位置變數的值,這裡 nPtr 儲存的是 n 的記憶體位置, n 的值為整數 11
int t = *nPter;


會不會有點霧沙沙的呢?來編譯執行看看囉



應該腦袋有點比較清楚了吧!這部份大概是 C++ 中最難搞懂的地方。我們再用另一個例子來說明,連帶介紹參考與 new 關鍵字 (keyword)
#include <iostream>
#include <string>

using namespace std;

int main(void)
{
    string a = "There is no spoon.";
    cout << a << endl;
    
    //b為對 a 的指標
    string *b = &a;
    cout << b << endl;
    
    //c為對 a 的參考
    string &c = a;
    cout << c << endl;
    
    //d為另一個指標
    string *d = new string("There is no spoon.");
    cout << d << endl;
    
    return 0;
}

/* 《程式語言教學誌》的範例程式
    http://pydoing.blogspot.com/
    檔名:pointerdemo2.cpp
    功能:示範 C++ 程式 
    作者:張凱慶
    時間:西元 2012 年 10 月 */


宣告參考變數用到與取值運算子相同的 & ,但這出現在等號的左邊
string &c = a;


簡單來說,參考只是個別名,這個例子 ca 都是相同的字串 (string) 物件 (object) 。


下面用 new 建立新的字串物件, new 建立的物件就必須放在指標之中
string *d = new string("There is no spoon.");


new 為建立物件的例外一種方式,編譯執行結果如下



可能對 C++ 新手一下子搞不清楚這邊上面下面都有 * ,那邊左左右右也都有 & ,卻又往往有不同的意義,大概都需要些陣痛期才能完全摸清楚唄!接下來,我們繼續介紹變數命名規則囉!


中英文術語對照
指標pointer
變數variable
參考reference
別名alias
宣告declare
型態type
取址運算子address-of operator
反參考運算子dereference operator
關鍵字keyword
字串string
物件object


您可以繼續參考
基礎篇


相關目錄
回 C++ 入門指南
回 C++ 教材目錄
回首頁


參考資料
http://www.cplusplus.com/doc/tutorial/pointers/

2 則留言:

gchnj 提到...

我新學的
一看就明了
雖然我學過visual basic

Unknown 提到...

可以請問一下是什麼情況要用到指標嗎?
因為我看完後雖然知道指標是這樣,但完全不知道到底是什麼情況要用。