看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《icetofux ()》之銘言: : 開發平台(Platform): (Ex: VC++, GCC, Linux, ...) : GCC : 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) : N : 問題(Question): : 從資料上來看,如果傳陣列到其他函式中,傳的應該是陣列的起始位址,我進行了 傳的是陣列裡第0個元素的位址 : 下面的測試,結果與預期的有所出入,想請問是不是我的觀念錯了? : 餵入的資料(Input): : N : 預期的正確結果(Expected Output): : 下列的兩個cout結果相同 : 錯誤結果(Wrong Output): : 1.Array Addr in main: 0x22ff60 : 2.Array Addr in Func: 0x22ff20 : 程式碼(Code):(請善用置底文網頁, 記得排版) : 因為很短就直接po了: : void Func(char Array[]) : { : cout<<"2.Array Addr in Func:"<<hex<<&Array<<endl; &Array 的型態為 char** : } : int main() : { : char Array[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; : cout<<"1.Array Addr in main:"<<hex<<&Array<<endl; &Array 的型態為 char (*)[10] : Func(Array); : return 0; : } 不同型態的物件, 值跑出來有差不用太意外. : 補充說明(Supplement): 這邊需要清楚 void Func(char Array[])是什麼東西, 以下提供測 試碼: void Func( char Array[] ); void Func2( char *Array ); assert( typeid(Func) == typeid(Func2) ); std::cout << typeid(Func).name() << std::endl; 輸出如下(依編譯器有所不同): FvPcE 涵義為 Function which returns Void, and receives a Pointer to Char as argument... (最後一個E不明) 所以既然它們是一樣的, 我通常會建議學弟改用第二種寫法以免把 它當作陣列來用, 出現 sizeof(Array)等之類的寫法, 換一下你就 會知道在 Func 裡印的實際上是區域物件 Array的位址. 真的要用也是可以啦, 不過你就要使用 by reference的方式傳遞 陣列: typedef char CharArray10[ 10 ]; void Func( CharArray10 const &Array ) { cout << "2.Array Addr in Func:" << hex << &Array <<endl; } main 的地方都不用改你就能得到一樣的結果. -- ▂▂ ▄▂ T.T.L Listen 2 http://ppt.cc/jIUk ˇ ˇˇ ˇ 說什麼結束 ▃▃ http://ppt.cc/zQtB ψ髮箍 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.121.197.115
tomap41017:老師好(誤!) 04/26 16:10
改一下好了, 避免誤會.. 冏rz
icetofux:謝謝老師,其實關於指標我總是能避就避,這次剛好寫的 04/26 17:21
icetofux:很注重效能才去用的xd 04/26 17:21
用指標不一定會讓你的效能增加~
james732:用C與C++是避不掉指標的啊...XD 04/26 17:22
xatier:指標就是C強大之所在阿!! 04/26 17:55
dos792:有什麼理由不用c++ vector/string 嗎? 04/26 19:35
愈是強大的東西, 愈是難駕馭阿! :( ※ 編輯: loveme00835 來自: 140.121.197.115 (04/26 20:10)