看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《james732 (好人超)》之銘言: 僅傳遞起始位址的作法應該這麼作 void set(int *ptr, int st, int ed, int th, int etc) { int i, j, k, l; for(i=0; i<st; ++i) { for(j=0; j<ed; ++j) { for(k=0; k<th; ++k) { for(l=0; l<etc; ++l) { printf("%d\t", ptr[i*ed*th*etc+j*th*etc+k*etc+l]); } printf("\n"); } } } } set((int*)ary, ...); 額外提供的;這不是轉不轉型的問題而已。考慮一個二維陣列 動態的方式:int **ary=malloc...懶得寫了 你可以這麼使用它*(*(ary+i)+j)或是ary[i][j] 靜態的方式:int ary[2][3]={{1,2,3},{4,5,6}}; 你也可以這麼使用它*(*(ary+i)+j)或是ary[i][j] 但是如果將它轉型成動態指標,就好像強制轉型傳遞給函式那樣 *(*( (int**) ary+i)+j)執行的時候是會產生錯誤的 動態的陣列取址的時候是像這樣的 *(ary+i)所存的值是下一個維度的位址,對其作+j後再取值才是實際上所儲存的資料 嘗試著對"靜態"陣列印出位址看看 print("%p", &ary[0]); //&*ary 第一個位置儲存第二維位址的第一維位址 print("%p", &ary[0][0]); //&**ary 第一個位置儲存實際資料的第二維位址 會得到一樣的位址(動態分配的話會是不一樣的) 如果將這樣型態的東西強制當做動態指標來使用的話 當*(ary+i)的位址是指向自己本身的時候ary+i,是不會去找到*(*(ary+i)+j) 其實靜態陣列不論幾維都只有一個維度而已orz -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.33.184.50
NDark:用五個迴圈別鬧了好嗎...要是你跟我合作我一定重寫你的code 10/09 17:24
VictorTom:四個吧?? 不過那是原發問者他的code就四層的啦XD 10/09 17:37
james732:我想請問一下 這樣四層迴圈我也覺得很醜 但該怎麼改寫? 10/09 18:06
VictorTom:下面就是答案啦, 直接用數學計算出正確的index啊XD 10/09 18:24