[問題] 關於二維陣列傳入函式

看板C_and_CPP作者 (Jun)時間13年前 (2010/11/12 20:32), 編輯推噓9(9028)
留言37則, 13人參與, 最新討論串1/1
各位大大不好意思,小弟又來麻煩大家了,想問一個二維陣列的問題 void display()//如何傳入 { ...... } int main() { int x[2][3]={{1,2,3}, {4,5,6},}; display();//如何傳入 system("pause"); } 上面這個函式若是我想要將x[2][3]丟入display,但我的行跟列可能會變換, 這樣我應該要怎樣傳入函式呢?上面兩個如何傳入就是我的問題~~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 219.70.214.36

11/12 20:43, , 1F
display(int** x);
11/12 20:43, 1F

11/12 21:06, , 2F
二維陣列不能轉換為 ** 吧
11/12 21:06, 2F

11/12 21:24, , 3F
定義:xxx display(int [][3])
11/12 21:24, 3F

11/12 21:24, , 4F
呼叫:display(x);
11/12 21:24, 4F

11/12 21:25, , 5F
那這樣不就寫死了,行只能傳入三
11/12 21:25, 5F

11/12 21:25, , 6F
簡單一點就是display(int *x,int r)
11/12 21:25, 6F

11/12 21:26, , 7F
把r傳入每排的數量(我猜你每排的數量會一樣)
11/12 21:26, 7F

11/12 21:32, , 8F
我會把二維 cast 成一維,像 display((int *)x, 2, 3));
11/12 21:32, 8F

11/12 21:32, , 9F
那如果我要在display內顯示x所有值該怎寫呢
11/12 21:32, 9F

11/12 21:36, , 10F
http://nopaste.csie.org/ab528 我想這不是最好的寫法
11/12 21:36, 10F

11/12 21:39, , 11F
如果是C++的話就可以用template XD
11/12 21:39, 11F

11/12 21:46, , 12F
想請問一下james大,傳入為什麼要用(int*)x呢?
11/12 21:46, 12F

11/12 21:47, , 13F
你把 (int *) 拿掉的話應該會編譯錯誤 試試看
11/12 21:47, 13F

11/12 21:48, , 14F
我試過了,只是不知道為什麼要用(int*)x,想了解觀念!
11/12 21:48, 14F

11/12 21:49, , 15F
把整個二維陣列當作是一塊扁平的一維陣列
11/12 21:49, 15F

11/12 21:52, , 16F
那為什麼不能像一維陣列一樣丟x呢?
11/12 21:52, 16F

11/12 22:10, , 17F
請想像一下一維陣列如何算記憶體位址 二維陣列又怎麼算的?
11/12 22:10, 17F

11/12 22:11, , 18F
因為他本來不是一維的(c認定上) 如果你一開始自己用1維存
11/12 22:11, 18F

11/12 22:11, , 19F
然後用x[i*wide+j]這樣去控制 就可以不用轉型
11/12 22:11, 19F

11/12 22:13, , 20F
11/12 22:13, 20F

11/12 22:16, , 21F
把一維當作二維用 (需要動態的時候我會這麼寫)
11/12 22:16, 21F

11/12 22:23, , 22F
一樓...請看置底文第12誡~~
11/12 22:23, 22F

11/12 22:29, , 23F
那如果x變成三維的呢?是用(int**)x?
11/12 22:29, 23F

11/12 22:32, , 24F
我覺得我置底寫得很清楚啊,還是說我自我感覺太良好 XD
11/12 22:32, 24F

11/12 22:47, , 25F
會覺得三維使用(int **)的話,代表你還沒懂 XD
11/12 22:47, 25F

11/12 22:53, , 26F
以前都沒發現,因為都是用LPARAM傳陣列
11/12 22:53, 26F

11/12 22:54, , 27F
或者是LPVOID附帶資訊傳過法
11/12 22:54, 27F

11/12 22:56, , 28F
想不到傳個陣列這麼複雜,又學到一課了
11/12 22:56, 28F

11/12 23:00, , 29F
使用(int*)是要將x轉成指標嗎?
11/12 23:00, 29F

11/12 23:02, , 30F
三維也一樣...函式定義參數用指標去接 呼叫時傳入x[0][0]
11/12 23:02, 30F

11/13 00:13, , 31F
不管幾維不是都跟1維一樣不是嗎(話說原PO的問題我直覺是 *
11/13 00:13, 31F

11/13 13:17, , 32F
C 語言沒有「傳陣列」這種事, 全部都是指標
11/13 13:17, 32F

11/13 15:39, , 33F
把array用struct包起來然後傳struct instance算不算XD
11/13 15:39, 33F

11/13 15:43, , 34F
算啊
11/13 15:43, 34F

11/13 15:44, , 35F
把array用class包起來然後傳class instance也算不算
11/13 15:44, 35F

11/13 15:48, , 36F
樓上的, 不算喔, C語言沒有class....(光速逃XD)
11/13 15:48, 36F

11/13 15:50, , 37F
這麼說的話用union包起來也是可以的吧
11/13 15:50, 37F
文章代碼(AID): #1CtJFOXw (C_and_CPP)