Related Posts Plugin for WordPress, Blogger... 簡單易懂的低調手札: [memo] C++ 指標 筆記

2011年8月7日 星期日

[memo] C++ 指標 筆記

閱讀資料來自於:http://caterpillar.onlyfun.net/Gossip/CppGossip/Pointer.html


 


 變數名稱  ─ 指標 記憶體位址 


如上所述關係:


指標的名稱表示了位址,而當要取得指標指向位址裏頭的"值"便需要在指標錢加上 ' * ' 運算子。


' * ' 這運算子被稱作"間接值"或"提領運算子"。


 


我們在學習指標時常常看到一個東西  " * ptr "


ptr 其實就是 Pointer (我們說的指標),同時他也是保留字所以不要看到他就害怕了。


 


舉例:


int *ptr;


int * ptr;


上面這兩行其實是一樣的,對於編譯器來說,空白置於何處是沒差別的。


 


但是下面這個宣告就不同了。


舉例:


int * p1,p2;


上面這個宣告中,宣告了一個指標 ( int *p1 )與一個整數( int p2 )。


所以這邊要說的是,每一個指標他的變數名稱都需要 ' * ' 。


 


 




 


在 C++ 裏頭,宣告指標的時候要注意的還有下面這點。


舉例:


int *test;


*test = 123456;


假如把 code 寫成上面這樣的表示式可能會發生不可預期的狀況。


這裡我們宣告了 test 指標 ,但是我們卻忘了指定這指標要指向什麼位址!


使得這時 test 指向的記憶體位址便可能是任意值。


那第二行的 123456 又該存去哪裡呢?自然是 test 指向的任意一個位址囉!


所以我們應該竭力避免上面這種宣告方式。


(因為這種不好的宣告方式編譯器是很難找出錯誤的。)


 


 




 


 


C++ 用 new 配置記憶體。


 


這邊要提點一下:指標的價值在於當程式執行期間配置無名稱的記憶體來儲存值。


 


在 C 裏頭使用 malloc() 配置記憶體。


在 C++ 當然也可以用,但是用 new 會更好。


 


舉例1:


int * test = new int;


 


我們 new 出一個資料型態(上面的例子是個 int )佔住記憶體中一個區塊,


並且將這個區塊的位址指定給 test 這個指標。


 


下面再提供另一種配置記憶體的方法做個比較。


舉例2:


int dog;


int *test_2 = &dog;


 


&讓我們直接取得記憶體位址,而 test_2 間接得到了 dog 的記憶體位址。


dog ── test_2 ── 記憶體區塊


舉例1 跟 舉例2 的差別乍看下好像沒有不同,但是稱呼上就截然不同了。


在 舉例2 裏頭我們可以透過變更 dog 這個變數名稱進行存取。


 


但是在 舉例1 中我們卻是在存取一個指標,而這個指標卻沒有一個名稱!


用下面這個來解釋會更清楚 ↓


?????? ── test ── 記憶體區塊


 


從上面我們來做個結論:


舉例2 在處理資料物件的時候看起來好像更優於 舉例1 ,


但其實 舉例1 在管理記憶體上卻是有更大的優勢。


比如我們開發程式在一個板子或是嵌入式的環境上頭,記憶體的管理就顯示出它的重要性了。


 


 




 


沒有留言:

張貼留言