看板 NTPU-CSIE97 關於我們 聯絡資訊
※ 引述《eiteki (大英 )》之銘言: : 引用原文中的扣得然後有些問題 : : ========================CODE========================== : : template <> char* maxn(char* array[], int n){ : : ... : : return array[maxi]; : : } : : ... : : cout << maxn(s, 5) << endl; : : ====================================================== : 這是用printf: : : printf("%x", array[3]); : 用printf印出記憶體位置時我用的是%p , : 印出來的記憶體位置(我自己的電腦)是00417810 : 但是用%x卻印出 417810 %p是表示要用記憶體位置的方式輸出,%x是表示用16進位的方式輸出,兩者皆可。 其實00417810和417810是一樣的,只是因為%p印出的東西就是記憶體位置, 所以前面會自動補0,%x印的未必是記憶體,就像我們用int印出一百二十三, 它會印出123而不是0000123的道理是一樣的。 : 用count: count:是啥...? : : 第二種方法還是用cout,不過要加上強制轉型,把回傳值轉成int, : : 告訴cout,你給我用int輸出!! : : cout << hex << (int)maxn(s, 5) << endl; : : 這樣子也是可以的。 : 請問強制轉型是指把原來回傳的值(指向char的pointer)轉成int?? : 如果用上面引用的扣得印出, 則出現417810 : 若把(int)maxn(s, 5)改成(int *)maxn(s, 5)則會印出 00417810 : 回傳的值是一個char指標, 轉成int後是否就使它失去指標的功能 : 但記憶體位置仍然存放在裡面? 所以cout很單純的可以印出 說它它失去指標的功能感覺有點怪怪的,應該是說我強迫用int去解釋 那一格記憶體裡面的東西,所以它不把它當作指標看待。 : 轉成int * 之後它會強制轉為一個指向int的指標 : 這時它卻不會印出指向的字元的ASCII碼?? 轉成 int* 概念上好像是對的,但實際上卻不行,至於為什麼,這個我也不太清楚 可能還要查個資料,或是問老師。 不過如果你想印出ASCII碼的話,可以這樣子做: cout << (int)*maxn(s, 5) << endl; *會先去對回傳回來的記憶體位置取值,然後再把它轉換成int型態。 : 以上是想分辨其中的不同以及了解原因,另外hex是只用16進位印出嗎? hex就是16進位的意思。 : cout << (int *)maxn(s, 5) << endl; : 如此印出仍然出現00417810 : 可以講解一下嗎 謝囉 cout很聰明,當它發現要印出來的是記憶體位置時,它就會自動以hex的方式印出。 所以其實我們加的hex都是多餘的...= =|| 以上 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.169.3.161
kirinichiban:專業好文推 03/25 01:32
eiteki:謝謝 好專業 count是手殘打錯=..= 03/25 17:52