[問題] 動態配置下二維陣列參數傳遞

看板C_and_CPP (C/C++)作者 (Ben)時間11年前 (2015/02/03 19:34), 編輯推噓1(1041)
留言42則, 5人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) GCC 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) None 問題(Question): 想嘗試練習指標與陣列的相關使用 compile時就宣告好大小的二維陣列依照置底方式傳遞應該沒問題 在動態配置的陣列傳遞時,想要採用轉成一維陣列卻無法得到正確結果 餵入的資料(Input): row=5 column=5 預期的正確結果(Expected Output): 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 錯誤結果(Wrong Output): 5*5的完全不是1的數字 程式碼(Code):(請善用置底文網頁, 記得排版) #include<stdio.h> int c_array(int *a,int row,int column,int i,int j) { printf("%d ",*( a + i*column +j ) );//使用pointer來控制矩陣 } int main(void) { int **ptr=NULL; int row,column; int i,j; while(1) { printf("row=\n"); scanf("%d",&row); printf("column=\n"); scanf("%d",&column); if(row==0 && column==0) break; ptr=(int**)malloc(sizeof(int*)*row); //生成一維指標陣列 for(i=0;i<row;i++) { ptr[i]=(int*)malloc(sizeof(int)*column); }//二維 for(i=0;i<row;i++) { for(j=0;j<column;j++) { ptr[i][j]=1; } }//將矩陣付值:1 for(i=0;i<row;i++) { for(j=0;j<column;j++) { //printf("%d",ptr[i][j]);//測試用 c_array((int*)ptr,row,column,i,j);//使用另外函數來print } printf("\n");//換行 } for(i=0;i<row;i++) free(ptr[i]); free(ptr);//釋放記憶體 } return 0; } 補充說明(Supplement): 無 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.169.182.246 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1422963297.A.B4F.html

02/03 19:40, , 1F
http://ideone.com/JQjKaJ 舒服閱讀版
02/03 19:40, 1F

02/03 19:52, , 2F
(int*) ptr這邊是錯的吧...
02/03 19:52, 2F

02/03 19:53, , 3F
你把存放每個一維陣列指標的陣列的位置傳過去了...
02/03 19:53, 3F

02/03 19:57, , 4F
那大概怎麼傳呢@@? 抱歉pointer就是在練習中QQ
02/03 19:57, 4F

02/03 20:04, , 5F

02/03 20:08, , 6F
能夠討教箇中原理嗎?(跪
02/03 20:08, 6F

02/03 20:12, , 7F
這不畫個圖,老實說用文字講起來還滿難講的 XD
02/03 20:12, 7F

02/03 20:14, , 8F
我先說我的理解:我原本的作法
02/03 20:14, 8F

02/03 20:16, , 9F
是把二維矩陣平面化成一維:p11 p12 p13 p21 p22 p23..
02/03 20:16, 9F

02/03 20:17, , 10F
所以我在函數內的處理上以為傳進的Pointer就可以進行
02/03 20:17, 10F

02/03 20:18, , 11F
操作成數值(ex: p23=*(&p11+3*1+3)
02/03 20:18, 11F

02/03 20:19, , 12F
但我是用pointer動態配置二維矩陣的
02/03 20:19, 12F

02/03 20:20, , 13F
也就是函數看到的就真的只是一個一維矩陣,上面一堆P
02/03 20:20, 13F

02/03 20:21, , 14F
一堆pointer,所以反而應該用雙重矩陣去解讀,再拆開
02/03 20:21, 14F

02/03 20:21, , 15F
雙重指標*
02/03 20:21, 15F

02/03 20:26, , 16F
*( a + i*column +j ) 一維陣列表示二維陣列,不同等動態
02/03 20:26, 16F

02/03 20:26, , 17F
二維取索引,最大的差別是可能不連續,碎片化。
02/03 20:26, 17F

02/03 20:27, , 18F
當然還有額外指標空間,沒畫圖真不好說
02/03 20:27, 18F

02/03 20:28, , 19F
我後來的理解大致上是對的嗎? 還有
02/03 20:28, 19F

02/03 20:29, , 20F
依照炸彈貓大修改後,傳入那邊 無論使用
02/03 20:29, 20F

02/03 20:30, , 21F
ptr、(int*)ptr、(int**)ptr、(int***)ptr都會是正解
02/03 20:30, 21F

02/03 20:30, , 22F
why?
02/03 20:30, 22F

02/03 20:32, , 23F
樓上大哥講出重點了,可以再想想
02/03 20:32, 23F

02/03 20:33, , 24F
如果找一個你身邊的人會的,畫個圖,你應該三秒就懂 XD
02/03 20:33, 24F

02/03 20:34, , 25F
所以我推文的後來想法還是錯的嗎QQ
02/03 20:34, 25F

02/03 20:35, , 26F
就:我把內涵一堆指標的一維矩陣丟進函數
02/03 20:35, 26F

02/03 20:35, , 27F
對這東西作一維處理,不管怎樣都(ry
02/03 20:35, 27F

02/03 20:38, , 28F
www.programmer-club.com.tw/ShowSameTitleN/c/45669.ht
02/03 20:38, 28F

02/03 20:39, , 29F
ml 有點長,網址分兩段打
02/03 20:39, 29F

02/03 20:39, , 30F
回文裡有個圖,你看看也許有幫
02/03 20:39, 30F

02/03 20:39, , 31F
02/03 20:39, 31F

02/03 20:57, , 32F
我覺得你的後來想法應該是對的
02/03 20:57, 32F

02/03 20:58, , 33F
ptr、(int*)ptr、(int**)ptr、(int***)ptr都會是正解是因
02/03 20:58, 33F

02/03 21:00, , 34F
為C語言的type checking比較寬鬆,JAVA、Pascal就沒辦法
02/03 21:00, 34F

02/03 21:00, , 35F
讓你這樣compile過
02/03 21:00, 35F

02/03 21:07, , 36F
對c_array而言,a的tpye就是int **不管它的值怎麼取得的
02/03 21:07, 36F

02/03 21:10, , 37F
也就是我不管在那一行怎麼cast,c_array都會用
02/03 21:10, 37F

02/03 21:11, , 38F
雙重指標接所以OK。然而其他語言的compiler再檢查
02/03 21:11, 38F

02/03 21:12, , 39F
雙邊type時比較嚴格,所以應該是只有(int **) ptr 過?
02/03 21:12, 39F

02/03 21:13, , 40F
我覺得是這樣啦 :)
02/03 21:13, 40F

02/03 21:14, , 41F
感謝樓上各位大大,感激不盡
02/03 21:14, 41F

02/03 21:17, , 42F
題外話:炸彈貓那個*(*(a+i)+j)其實就是a[i][j] XD
02/03 21:17, 42F
文章代碼(AID): #1KqB9XjF (C_and_CPP)
文章代碼(AID): #1KqB9XjF (C_and_CPP)