Re: [問題] 關於傳陣列到函式的問題

看板C_and_CPP (C/C++)作者 (朴髮箍)時間15年前 (2011/04/26 14:36), 編輯推噓3(303)
留言6則, 5人參與, 最新討論串2/2 (看更多)
※ 引述《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

04/26 16:10, , 1F
老師好(誤!)
04/26 16:10, 1F
改一下好了, 避免誤會.. 冏rz

04/26 17:21, , 2F
謝謝老師,其實關於指標我總是能避就避,這次剛好寫的
04/26 17:21, 2F

04/26 17:21, , 3F
很注重效能才去用的xd
04/26 17:21, 3F
用指標不一定會讓你的效能增加~

04/26 17:22, , 4F
用C與C++是避不掉指標的啊...XD
04/26 17:22, 4F

04/26 17:55, , 5F
指標就是C強大之所在阿!!
04/26 17:55, 5F

04/26 19:35, , 6F
有什麼理由不用c++ vector/string 嗎?
04/26 19:35, 6F
愈是強大的東西, 愈是難駕馭阿! :( ※ 編輯: loveme00835 來自: 140.121.197.115 (04/26 20:10)
文章代碼(AID): #1DjcVyrZ (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1DjcVyrZ (C_and_CPP)