Re: [語法] 回傳一個二維陣列

看板C_and_CPP (C/C++)作者 (我要加入劍道社!)時間16年前 (2009/05/14 11:57), 編輯推噓3(300)
留言3則, 3人參與, 最新討論串2/2 (看更多)
※ 引述《QQ29 (我愛阿蓉)》之銘言: : Q這樣的prototype 是OK的 傳入一個二維陣列 : 但是我想依樣 return 的型態也寫成 跟Q傳入的一樣 : 但是怎麼寫就是不給我過~ : 原因不明= = : 請教各位 : 謝謝 首先呢,陣列在 C/C++ 中並不是 first-class object 至少你不能回傳一個陣列 但是你可以回傳一個指向陣列的 pointer 這是合法的 然而 C 的語法有個非常奇怪的地方 那就是宣告陣列時 維度要放在變數的後面 int b[10]; 而不是這樣 int[10] b; 所以當你宣告某個指向陣列的 pointer 時,因為 operator priority 語法會變得更有趣: 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 可用: typedef int (*T)[10]; // T 的型別就是「指向陣列的 pointer」 T f(); // F() 回傳一個 pointer,指向某個陣列 最後是我誠心的建議:C/C++ 的陣列很難用,別再動歪腦筋了, 請寫個 class 包起來用。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 219.87.151.2

05/14 12:37, , 1F
推l大, 小弟也會想痛毆寫那種程式的人....>_<#
05/14 12:37, 1F

05/14 13:35, , 2F
嗯所以我覺得 JAVA 比 C/C++ 漂亮些
05/14 13:35, 2F

05/14 13:37, , 3F
auto f()->int(*)[10] {return something;} /flee
05/14 13:37, 3F
文章代碼(AID): #1A2vQnRe (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1A2vQnRe (C_and_CPP)