Re: [語法] 回傳一個二維陣列
看板C_and_CPP (C/C++)作者littleshan (我要加入劍道社!)時間16年前 (2009/05/14 11:57)推噓3(3推 0噓 0→)留言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
05/14 12:37, 1F
推
05/14 13:35, , 2F
05/14 13:35, 2F
推
05/14 13:37, , 3F
05/14 13:37, 3F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章