《大話資料結構》書中有關單鏈表的寫法疑問,正如該鏈結270樓的人所說的對於linklist的疑問,為啥不用linklist p來作為函式的形參。作者寫得很清楚,但是我還是不是很明白,因此查了網上的一些關鍵字。
引用 @伍迷
老師 您好 我有個問題一直想不通 ,就是您前面的那個鍊錶**的初始化**是:status initlist(linklist *l)
我想不通為什麼用 linklist *l 而不是用 linklist p, p 也是個一級指標,也能改變鍊錶的,為什麼多此一舉用二級指標呢??
這個原因是因為當指標做引數數,在用這個指標重新分配記憶體時,會報錯,詳見《高質量c/c++程式設計》中的指標做引數
查網上關鍵字,看到以下鏈結加深對指標的指標的了解。
裡邊的回答是:
您既然對指標有定義上的了解,那麼理解指標的指標也不會很難
關鍵認識清楚,指標變數也是一種變數,有著自己的值和它自身在記憶體中的位址
例如int a=6,我們假設它在記憶體中位址為1276af73,而值為前面賦給的6
下面定義乙個指標
int *p=&a;
將指標變數p指向了a,那麼p這個變數的值就是a的位址1276af73,而它自身又有自己在記憶體中的位址,我們假設為1234fe34.
同樣的道理,我們可以定義乙個新的指標變數,讓它指向指標變數p:
int *q=&p;
這個新的指標變數q的值為p的位址,即1276af73,而它自身又在記憶體中也有自己的位址,假設為128974ad
同理,我們可以繼續定義下去指向q的指標。。。
這種指向指標變數的指標,我們就稱做指標的指標
進一步,再看指標的指標在程式中執行是如何的?
而書本的作者指出,當指標做引數傳遞的時候不能用該指標來動態申請記憶體。詳細可以看
直接用str指標引數去子函式申請記憶體,而不用指標的指標去申請申請新記憶體,那麼指標引數在子函式中生成副本p,只是副本p所指的記憶體位址改變了,而str並沒有絲毫改變。
|str|------->|null|
|副本p|--------->|新開闢的記憶體|
原來的指標副本p是和str一樣,都是指向null空間,後來副本p在子函式中執行新開闢記憶體,而傳進來的指標str則並無絲毫改變。
聯想:推而廣之,這個道理適用在交換兩個數值的函式宣告和函式體寫法中,很容易出錯。
綜上理解:
有這麼乙個定論,如果需要用到生成動態記憶體的情況,必須使用「指向指標的指標」去申請記憶體。針對《大話資料結構》裡單鏈表的**情況,主函式中的&l就是指向乙個指標的位址,而這個指標剛好又指向單鏈表中的結點,所以是指向指標的指標,而子函式中的linklist *l中的*l在下面函式的操作中就是新申請的結點記憶體,而l就是指向該結點記憶體的位址,剛好可以對應起來。
一些關於陣列和指標的想法
指標是c的難點和精華,當他和陣列相遇時,如果沒有好好理清它們之間的關係和原理,那真是搞不清理還亂了。1 二維陣列a代表什麼含義?首先定義了乙個二維陣列a,當然我們必須把a看成乙個一維陣列,它有兩個 大 行 元素,每個 大 行 元素都由五個 小 列 元素,這是我們理解陣列的前提條件。第七行定義了乙個i...
指標的一些知識
最近在複習c語言,要找工作啦,發現寫下來總結下,有助於掌握和理解知識,當然裡面有很多東西是網上找到,自己整理了下而已。1.指標陣列與陣列指標 首先要明白優先順序順序 優先順序 先來看指標陣列,定義int p 10 優先順序高,先與p結合成為乙個陣列,再由int 說明這是乙個整型指標陣列,它有n個指標...
指標的一些總結
2016年9月14日 指標陣列和陣列指標 指標陣列是指 陣列元素都是指標 int ptr 5 int a 2,b 3,c 6,p,q p a q b ptr 0 a 存入的是a的位址 ptr 1 b ptr 2 c cout ptr 0 ptr 0 endl cout ptr 1 ptr 1 end...