[情報] 今天實習課的第二題

看板NTPU-CSIE97作者 (Fish)時間15年前 (2009/03/24 00:01), 編輯推噓3(302)
留言5則, 4人參與, 最新討論串1/3 (看更多)
相信今天的實習課,大家應該都對第二題相當困惑吧! 我也很困惑...@@,我給助教DEMO的時候其實是用函式多載寫的...... 要不是複製很大複製不用錢,就是寫出來了結果自己也不知道是怎麼對的。 經過各位高手的協助,終於搞清楚是甚麼狀況了。 大家最有問題的應該是題目中這一句: the function should return the address of the first one tied for longest. 意思是要把最長的字串的記憶體位置回傳回來。 一般直覺好像會這樣子寫: ========================CODE========================== template <> char* maxn(char* array[], int n){ ... return array[maxi]; } ... cout << maxn(s, 5) << endl; ====================================================== 結果,它就直接把那個字印出來了... 這樣子看起來,似乎它是直接傳了值回來。(其實不是) 所以很直覺的在return後面加上&,編譯器說型態不對,然後補一顆*給回傳的型態, 然後就卡關了... 好吧,那我們就先來看看,我們想要的那個記憶體位置到底是多少? ========================CODE========================== template <> char* maxn(char* array[], int n){ ... cout << &array[maxi] << endl; return array[maxi]; } ====================================================== 這樣子做,只要呼叫了這個函式,的確會印出一個記憶體位置出來, 不過仔細想想,其實這個記憶體位置並不是我們所要的哦! 假設我們在主函式裡面這樣子宣告: char *s[5] = {"gg", "GG", "QQ", "ntpu", "csie"}; 那麼在記憶體裡面的情況就是以下的圖,一格代表一個記憶體位置: ↓這是指向字元的指標陣列,也就是s。 ┌─┐ ┌─┬─┐ │0│ → │g│g│ ├─┤ ├─┼─┤ │1│ → │G│G│ ├─┤ ├─┼─┤ │2│ → │Q│Q│ ├─┤ ├─┼─┼─┬─┐ │3││n│t│p│u│ ├─┤ ├─┼─┼─┼─┤ │4│ → │c│s│i│e│ └─┘ └─┴─┴─┴─┘ 把s傳到maxn裡面之後,最後找到符合條件的是索引值3的ntpu。 array[3]就是圖中綠色的3那一格,這個盒子裡面放的是白色的n這一格的記憶體位置, 就我們的認知,cout << array[3] << endl印出來的應該就是我們要的答案, 其實不是,這一切都是cout惹的禍,它太聰明了, 它知道那是一個指標,所以就把這個記憶體位置的東西印出來了,所以它印出了ntpu, 那這樣子如何?cout << &array[3] << endl; 它的確印出了一個記憶體位置, 但那其實是綠色3那一格的記憶體位置,並非我們要的, 因為array[3]本身是綠色的3那一格,對它取址很自然的會取到綠3記憶體位置。 講了半天,到底要怎麼印出我們要的記憶體位置呢?兩個方法。 先講笨的,既然是笨方法,就要用比較笨的printf, 說起來printf真的比cout笨了一點,不過倒是挺老實的。 printf("%x", array[3]); 它就真的乖乖的印出array[3]裡面的東西,也就是我們要的記憶體位置。 第二種方法還是用cout,不過要加上強制轉型,把回傳值轉成int, 告訴cout,你給我用int輸出!! cout << hex << (int)maxn(s, 5) << endl; 這樣子也是可以的。 以上,希望對大家有幫助。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.169.29.57 ※ 編輯: michaeltsai 來自: 118.169.29.57 (03/24 00:03)

03/24 00:04, , 1F
這一篇文章值 71 銀 (我打的這麼辛苦...@@)
03/24 00:04, 1F

03/24 00:08, , 2F
專業推!! 要賺錢請一個一個字打
03/24 00:08, 2F

03/24 00:12, , 3F
我只不過是 打到一半斷線了 從暫存檔裡面讀...
03/24 00:12, 3F

03/24 00:24, , 4F
哭哭 不過漁哥就甘心 還有 ohohyeah超宅 馬上回
03/24 00:24, 4F

03/24 19:30, , 5F
繽紛 清新 專業
03/24 19:30, 5F
文章代碼(AID): #19nx92Py (NTPU-CSIE97)
文章代碼(AID): #19nx92Py (NTPU-CSIE97)