Re: [語法] 回傳一個二維陣列- 看板C_and_CPP

文章推薦指數: 80 %
投票人數:10人

首先呢,陣列在C/C++ 中並不是first-class object 至少你不能回傳一個陣列但是你可以回傳一個指向陣列的pointer 這是合法的然而C 的語法有個非常奇怪 ... 批踢踢實業坊 › 看板C_and_CPP 關於我們 聯絡資訊 返回看板 作者littleshan(我要加入劍道社!)看板C_and_CPP標題Re:[語法]回傳一個二維陣列時間ThuMay1411:57:352009 ※引述《QQ29(我愛阿蓉)》之銘言: :Q這樣的prototype是OK的傳入一個二維陣列 :但是我想依樣return的型態也寫成跟Q傳入的一樣 :但是怎麼寫就是不給我過~ :原因不明== :請教各位 :謝謝 首先呢,陣列在C/C++中並不是first-classobject 至少你不能回傳一個陣列 但是你可以回傳一個指向陣列的pointer 這是合法的 然而C的語法有個非常奇怪的地方 那就是宣告陣列時維度要放在變數的後面 intb[10]; 而不是這樣 int[10]b; 所以當你宣告某個指向陣列的pointer時,因為operatorpriority 語法會變得更有趣: int*a[10];//a是一個陣列,元素是int* int(*b)[10];//b是一個pointer,指向有10個int的陣列 int*[10]c;//語法錯誤,維度要放後面 現在我們來看函式宣告 (int*)[10]f();//錯誤同上,維度要放後面 int*f()[10];//f()回傳一個陣列,元素是int*, //但C/C++中函式無法回傳陣列! int(*f())[10];//正確,f()回傳一個pointer,指向某個陣列 光看到這種宣告,我就會想要痛毆寫出這種程式碼的人。

事實上,只要C/C++改用「維度放在前面」的宣告方法, 就可以明顯增加可讀性: //以下不是合法的C/C++ int[3]a;//a有三個元素 int[3][4]b;//b是個4x3的二維陣列 int[3]*c;//c是個pointer,指向「有三個元素的陣列」 int*[4]d;//d是四個元素組成的陣列,每個元素都是int* int[3][4]*f();//f()是個函式,回傳的pointer指向4x3的二維陣列 不過這畢竟不是合法的C/C++,所幸我們還有typedef可用: typedefint(*T)[10];//T的型別就是「指向陣列的pointer」 Tf();//F()回傳一個pointer,指向某個陣列 最後是我誠心的建議:C/C++的陣列很難用,別再動歪腦筋了, 請寫個class包起來用。

-- ※發信站:批踢踢實業坊(ptt.cc) ◆From:219.87.151.2 推VictorTom:推l大,小弟也會想痛毆寫那種程式的人....>_int(*)[10]{returnsomething;}/flee05/1413:37



請為這篇文章評分?