作者bben900911 (Ben)
看板C_and_CPP
標題[問題] 動態配置下二維陣列參數傳遞
時間Tue Feb 3 19:34:54 2015
開發平台(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
→ PkmX: (int*) ptr這邊是錯的吧... 02/03 19:52
→ PkmX: 你把存放每個一維陣列指標的陣列的位置傳過去了... 02/03 19:53
→ bben900911: 那大概怎麼傳呢@@? 抱歉pointer就是在練習中QQ 02/03 19:57
→ 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