Re: 杰哥..

看板NCU88EEb作者 (我討厭香港人..)時間22年前 (2002/01/05 10:57), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串3/9 (看更多)
※ 引述《GAMRYA (愛,從不逗留)》之銘言: : ※ 引述《darkguy (我討厭香港人..)》之銘言: : : 杰哥,可不可以簡述一下pointer的功能與重要性 : : 因為我現在看的程式裡都是一大堆pointer宣告 : : 又是函數指標結構指標的..看的頭昏腦脹煩都煩死了 : pointer的重要性是:重要!重要!很重要!! : 『動態記憶體配置和指標的操控,是真正的C++程式設計的基礎概念』 : ----> 此語出自C++ Primer一書,C++的必讀聖經之一 : 功能的話,基本的用法就是可以代替(應該說指明)一個object的本身來做操作。 : (如果不太清楚object的意義,就先把object想成一個簡單的變數。 : 複雜的object就是像你上文講的函數、結構struct或者是class一類的東西。) : 要用指標來代替object本身來做操作,是因為這樣一來操作的彈性大, : 然後處理的資料量小(不需動到object本身,只要動指標),速度快。 : 譬如我用一個1000個elements的 A陣列存放資料,然後要丟給某個 : 副程式P作處理,如果整個陣列都傳給P的話不是太可怕了嗎?需要 : copy 1000個elements,浪費時間又佔記憶體﹔ 這時候就可以宣告 : 一個指向A陣列的指標 *A,把*A傳給P就可以了,不必傳整個A陣列, : P就能對A陣列作處理。(這個A陣列就是之前說的object。) : 另外一個常用的地方就是在linked-list(後面簡稱LL)的使用上。 : LL這種資料結構不知道你有沒有印象?可以把它想像成火車車廂一樣, : 每一個車廂是一個element,除了本身的資料,還要有一個勾勾扣住 : 下一個車廂,一個扣一個這樣把所有的車廂串起來,而那個勾勾就是 : 指標,指向下一個element。 : LL的強大在於幾乎所有的資料結構都可以用它implement出來,而且很 : 靈活有彈性,要怎麼串都可以。所以需要用到動態記憶體配置的場合上, : 很多資料結構都是用LL去做出來的,因此指標的重要性更是不言可喻。 : : 又"資料結構"的內容是在講述什麼啊?? : : 好像資工系有這門課的樣子..最近又再度聽到這個名詞但不知它是幹嘛的 : 資料結構顧名思義,就是一堆資料放在一起的方式阿。 : 要是資料都像扔到垃圾堆裡面一樣丟在一起,要找資料不是很難找嗎? : 所以要把資料依照一定的方式放好,放好的結構就是資料結構...... : 我們最熟悉的資料結構就是陣列array阿,資料一個挨著一個排排坐好。 : 然後大家應該也聽過的就是queue和stack,其實都可以看成存取方式有 : 限制的一維array的變形。 : 另外大家也熟悉的、topology比較不同的就是tree。 : 當然這些基本的結構熟悉了就差不多了,其他的資料結構都可以視為變形。 : 然後如前面所述,這些資料結構都可以用LL做出來。一維array 用LL做 : 出來就是火車廂的例子,二維的array用LL做出來就是每個車廂都有兩個 : 勾子分別勾住左(或右)邊和後面的車廂,形成一個網狀的結構。 : tree的話用LL做是很直覺的,每一個parent都有勾子勾住children,或是 : 說每一個node都有指標指向自己的children。 : (資料結構是比較偏演算法層次的東西,所以要怎麼實作是另一回事。 : 像tree可以用array做出來,不過就沒有用LL做那麼直覺、有彈性。) : 以下舉個例子實際說明指標在動態記憶體配置上的"彈性": : 例如我有一些客戶的資料要存起來。因為這些客戶之間沒有依存的關係, : 所以很明顯不適合以tree的結構存,因此我要用 array的方式存起來﹔ : 但是客戶數目會成長阿,我該怎麼宣告array的大小呢? : 例如我估計有50個客戶,因此宣告 array的大小是50,結果客戶20幾個 : 之後就不再增加了,那那些宣告的空間不就浪費掉了?如果後來客戶成長 : 到 100多個, array的大小不夠紀錄怎麼辦? : 這時候就可以用LL做 array,每增加了一個客戶,就多宣告一個車廂, : 然後用指標(勾勾)和之前的火車串起來。如果要刪除一個客戶的資料, : 就把該車廂前後的車廂串起來,再把那個車廂拿掉,這就是動態地調整 : 資料在記憶體裡的配置,就是array所缺乏的「彈性」。 : : 唉呀..我總覺得我好像要轉型成資工系的..真辛苦啊... : 可是我記得指標的基本使用電機有教過,應該是曾黎明的計概課和 : 大二時洪迥宗教的資料結構(紅色有人走路那本課本)......:PP : 我上面講的是很基本的概念,你實際碰到的問題應該是比較複雜的應用, : 不過原則是共通的。先把function或struct看成一個object,不要 : 管它內部是啥,當作chip一樣,先去看chip之間的layout,也就是先看 : 每個object之間的關係,然後再深入到每個 chip/object看它內部, : 這樣分析起來比較清楚。 : --- : 然後我要附帶提醒的就是,由於pointer太有彈性、功能太強了, : 初學者一方面有必要去好好學,另一方面又很矛盾地最好不要太常用, : 或者說要用得很謹慎。因為指標很容易就能破壞OOP上講求的encapsulation﹔ : 而且不用的指標萬一沒有delete掉,會造成garbage的問題﹔再來就是 : 指標指到不對的地方,有可能會造成危險﹔後面兩個是大部分的人(不只 : 初學者)都很容易犯的錯。 : 在程式比較大的時候,指標的使用更容易混亂。例如在繼承、virtual function : 上就可以用那令人驚奇的彈性做出更多特別的功能,例如一個指標在 : compile time可以還沒決定呼叫哪個function,一直到run time才決定等等, : 很可怕,不熟悉指標的人很容易弄錯。 : 不過我猜你看的那些程式應該偏工程應用,不會用到這些偏資訊軟體的寫法吧.. ※ 引述《GAMRYA (愛,從不逗留)》之銘言: : ※ 引述《darkguy (我討厭香港人..)》之銘言: : : 杰哥,可不可以簡述一下pointer的功能與重要性 : : 因為我現在看的程式裡都是一大堆pointer宣告 : : 又是函數指標結構指標的..看的頭昏腦脹煩都煩死了 : pointer的重要性是:重要!重要!很重要!! : 『動態記憶體配置和指標的操控,是真正的C++程式設計的基礎概念』 : ----> 此語出自C++ Primer一書,C++的必讀聖經之一 : 功能的話,基本的用法就是可以代替(應該說指明)一個object的本身來做操作。 : (如果不太清楚object的意義,就先把object想成一個簡單的變數。 : 複雜的object就是像你上文講的函數、結構struct或者是class一類的東西。) : 要用指標來代替object本身來做操作,是因為這樣一來操作的彈性大, : 然後處理的資料量小(不需動到object本身,只要動指標),速度快。 : 譬如我用一個1000個elements的 A陣列存放資料,然後要丟給某個 : 副程式P作處理,如果整個陣列都傳給P的話不是太可怕了嗎?需要 : copy 1000個elements,浪費時間又佔記憶體﹔ 這時候就可以宣告 : 一個指向A陣列的指標 *A,把*A傳給P就可以了,不必傳整個A陣列, : P就能對A陣列作處理。(這個A陣列就是之前說的object。) : 另外一個常用的地方就是在linked-list(後面簡稱LL)的使用上。 : LL這種資料結構不知道你有沒有印象?可以把它想像成火車車廂一樣, : 每一個車廂是一個element,除了本身的資料,還要有一個勾勾扣住 : 下一個車廂,一個扣一個這樣把所有的車廂串起來,而那個勾勾就是 : 指標,指向下一個element。 : LL的強大在於幾乎所有的資料結構都可以用它implement出來,而且很 : 靈活有彈性,要怎麼串都可以。所以需要用到動態記憶體配置的場合上, : 很多資料結構都是用LL去做出來的,因此指標的重要性更是不言可喻。 : 又"資料結構"的內容是在講述什麼啊?? : : 好像資工系有這門課的樣子..最近又再度聽到這個名詞但不知它是幹嘛的 : 資料結構顧名思義,就是一堆資料放在一起的方式阿。 : 要是資料都像扔到垃圾堆裡面一樣丟在一起,要找資料不是很難找嗎? : 所以要把資料依照一定的方式放好,放好的結構就是資料結構...... : 我們最熟悉的資料結構就是陣列array阿,資料一個挨著一個排排坐好。 : 然後大家應該也聽過的就是queue和stack,其實都可以看成存取方式有 : 限制的一維array的變形。 : 另外大家也熟悉的、topology比較不同的就是tree。 : 當然這些基本的結構熟悉了就差不多了,其他的資料結構都可以視為變形。 : 然後如前面所述,這些資料結構都可以用LL做出來。一維array 用LL做 : 出來就是火車廂的例子,二維的array用LL做出來就是每個車廂都有兩個 : 勾子分別勾住左(或右)邊和後面的車廂,形成一個網狀的結構。 : tree的話用LL做是很直覺的,每一個parent都有勾子勾住children,或是 : 說每一個node都有指標指向自己的children。 : (資料結構是比較偏演算法層次的東西,所以要怎麼實作是另一回事。 : 像tree可以用array做出來,不過就沒有用LL做那麼直覺、有彈性。) : 以下舉個例子實際說明指標在動態記憶體配置上的"彈性": : 例如我有一些客戶的資料要存起來。因為這些客戶之間沒有依存的關係, : 所以很明顯不適合以tree的結構存,因此我要用 array的方式存起來﹔ : 但是客戶數目會成長阿,我該怎麼宣告array的大小呢? : 例如我估計有50個客戶,因此宣告 array的大小是50,結果客戶20幾個 : 之後就不再增加了,那那些宣告的空間不就浪費掉了?如果後來客戶成長 : 到 100多個, array的大小不夠紀錄怎麼辦? : 這時候就可以用LL做 array,每增加了一個客戶,就多宣告一個車廂, : 然後用指標(勾勾)和之前的火車串起來。如果要刪除一個客戶的資料, : 就把該車廂前後的車廂串起來,再把那個車廂拿掉,這就是動態地調整 : 資料在記憶體裡的配置,就是array所缺乏的「彈性」。 : : 唉呀..我總覺得我好像要轉型成資工系的..真辛苦啊... : 可是我記得指標的基本使用電機有教過,應該是曾黎明的計概課和 : 大二時洪迥宗教的資料結構(紅色有人走路那本課本)......:PP : 我上面講的是很基本的概念,你實際碰到的問題應該是比較複雜的應用, : 不過原則是共通的。先把function或struct看成一個object,不要 : 管它內部是啥,當作chip一樣,先去看chip之間的layout,也就是先看 : 每個object之間的關係,然後再深入到每個 chip/object看它內部, : 這樣分析起來比較清楚。 : --- : 然後我要附帶提醒的就是,由於pointer太有彈性、功能太強了, : 初學者一方面有必要去好好學,另一方面又很矛盾地最好不要太常用, : 或者說要用得很謹慎。因為指標很容易就能破壞OOP上講求的encapsulation﹔ : 而且不用的指標萬一沒有delete掉,會造成garbage的問題﹔再來就是 : 指標指到不對的地方,有可能會造成危險﹔後面兩個是大部分的人(不只 : 初學者)都很容易犯的錯。 : 在程式比較大的時候,指標的使用更容易混亂。例如在繼承、virtual function : 上就可以用那令人驚奇的彈性做出更多特別的功能,例如一個指標在 : compile time可以還沒決定呼叫哪個function,一直到run time才決定等等, : 很可怕,不熟悉指標的人很容易弄錯。 : 不過我猜你看的那些程式應該偏工程應用,不會用到這些偏資訊軟體的寫法吧.. 杰哥恕我駑鈍..我還有一些問題要問.. 首先我真的沒有linked-list的概念, 1. element可以是一個變數或陣列,結構嗎?? 為什麼每個element要link起來..而且還是用指標將他們串在一起 可以舉個實例說明一下嗎?? 2. 再來queue和stack可以講深入一點嗎??我不太了解他們的意義 3. 另外你舉的"指標在動態記憶體配置上的彈性"的例子 每增加或刪除一個客戶的資料要如何將"車廂"串起來或拿掉勒? 4. 還有不用的指標若不delete掉,造成garbage又會造成什麼傷害? 5. Trace 一個程式我應該如何開始??從那裡下手??該注意那些地方?? 這個問題好像有點大,不過我覺得我目前非常需要建立這個概念, 有了這個概念將來看程式的時候應該會事半功倍吧..我之前真是繞了 一大段遠路呢..想想真是浪費不少時間 順帶一提..你不說我還真忘了有洪炯宗這一號人物 他是電機系的老師嗎?? -- 我也希望常上課呀... 但教授也要努力點.... -- ※ 發信站: 批踢踢實業坊(ptt.twbbs.org) ◆ From: 61.223.70.199
文章代碼(AID): #yDck100 (NCU88EEb)
文章代碼(AID): #yDck100 (NCU88EEb)