看板 C_and_CPP 關於我們 聯絡資訊
開發平台(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
bben900911: http://ideone.com/JQjKaJ 舒服閱讀版 02/03 19:40
PkmX: (int*) ptr這邊是錯的吧... 02/03 19:52
PkmX: 你把存放每個一維陣列指標的陣列的位置傳過去了... 02/03 19:53
bben900911: 那大概怎麼傳呢@@? 抱歉pointer就是在練習中QQ 02/03 19:57
BombCat: http://ideone.com/Wv0xti 02/03 20:04
bben900911: 能夠討教箇中原理嗎?(跪 02/03 20:08
wenyonba: 這不畫個圖,老實說用文字講起來還滿難講的 XD 02/03 20:12
bben900911: 我先說我的理解:我原本的作法 02/03 20:14
bben900911: 是把二維矩陣平面化成一維:p11 p12 p13 p21 p22 p23.. 02/03 20:16
bben900911: 所以我在函數內的處理上以為傳進的Pointer就可以進行 02/03 20:17
bben900911: 操作成數值(ex: p23=*(&p11+3*1+3) 02/03 20:18
bben900911: 但我是用pointer動態配置二維矩陣的 02/03 20:19
bben900911: 也就是函數看到的就真的只是一個一維矩陣,上面一堆P 02/03 20:20
bben900911: 一堆pointer,所以反而應該用雙重矩陣去解讀,再拆開 02/03 20:21
bben900911: 雙重指標* 02/03 20:21
EdisonX: *( a + i*column +j ) 一維陣列表示二維陣列,不同等動態 02/03 20:26
EdisonX: 二維取索引,最大的差別是可能不連續,碎片化。 02/03 20:26
EdisonX: 當然還有額外指標空間,沒畫圖真不好說 02/03 20:27
bben900911: 我後來的理解大致上是對的嗎? 還有 02/03 20:28
bben900911: 依照炸彈貓大修改後,傳入那邊 無論使用 02/03 20:29
bben900911: ptr、(int*)ptr、(int**)ptr、(int***)ptr都會是正解 02/03 20:30
bben900911: why? 02/03 20:30
wenyonba: 樓上大哥講出重點了,可以再想想 02/03 20:32
wenyonba: 如果找一個你身邊的人會的,畫個圖,你應該三秒就懂 XD 02/03 20:33
bben900911: 所以我推文的後來想法還是錯的嗎QQ 02/03 20:34
bben900911: 就:我把內涵一堆指標的一維矩陣丟進函數 02/03 20:35
bben900911: 對這東西作一維處理,不管怎樣都(ry 02/03 20:35
wenyonba: www.programmer-club.com.tw/ShowSameTitleN/c/45669.ht 02/03 20:38
wenyonba: ml 有點長,網址分兩段打 02/03 20:39
wenyonba: 回文裡有個圖,你看看也許有幫 02/03 20:39
wenyonba: 助 02/03 20:39
BombCat: 我覺得你的後來想法應該是對的 02/03 20:57
BombCat: ptr、(int*)ptr、(int**)ptr、(int***)ptr都會是正解是因 02/03 20:58
BombCat: 為C語言的type checking比較寬鬆,JAVA、Pascal就沒辦法 02/03 21:00
BombCat: 讓你這樣compile過 02/03 21:00
BombCat: 對c_array而言,a的tpye就是int **不管它的值怎麼取得的 02/03 21:07
bben900911: 也就是我不管在那一行怎麼cast,c_array都會用 02/03 21:10
bben900911: 雙重指標接所以OK。然而其他語言的compiler再檢查 02/03 21:11
bben900911: 雙邊type時比較嚴格,所以應該是只有(int **) ptr 過? 02/03 21:12
BombCat: 我覺得是這樣啦 :) 02/03 21:13
bben900911: 感謝樓上各位大大,感激不盡 02/03 21:14
PkmX: 題外話:炸彈貓那個*(*(a+i)+j)其實就是a[i][j] XD 02/03 21:17