閱讀資料來自於: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 在管理記憶體上卻是有更大的優勢。
比如我們開發程式在一個板子或是嵌入式的環境上頭,記憶體的管理就顯示出它的重要性了。
沒有留言:
張貼留言