[情報] 今天實習課的第二題
相信今天的實習課,大家應該都對第二題相當困惑吧!
我也很困惑...@@,我給助教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
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
03/24 00:24, 4F
推
03/24 19:30, , 5F
03/24 19:30, 5F
討論串 (同標題文章)