看板 C_and_CPP 關於我們 聯絡資訊
之前有在板上貼了嘗試使用指標存放不同維度的陣列的程式碼 http://pastebin.com/d1Vjf9Dj #include <stdio.h> int main() { int n1[1] = {1}, n2[2][2] = {{211, 212}, {221, 222}}, n3[3][3][3] = {{{3111, 3112, 3113}, {3121, 3122, 3123}, {3131, 3132, 3133}}, {{3211, 3212, 3213}, {3221, 3222, 3223}, {3231, 3232, 3233}}, {{3311, 3312, 3313}, {3321, 3322, 3323}, {3331, 3332, 3333}}}; int *ptr[] = { n1, *n2, **n3 }; int i, j, k; printf( "%d\n", *ptr[0] ); for ( i = 0; i < 2; i++ ) for ( j = 0; j < 2; j++ ) printf( "%d %s", *( ptr[1] + 2*i + j ), ( j == 1 ) ? "\n" : "" ); for ( i = 0; i < 3; i++ ) for ( j = 0; j < 3; j++ ) for ( k = 0; k < 3; k++ ) printf("%d %s%s", *( ptr[2] + 3*3*i + 3*j + k ), ( k == 2 ) ? "\n" : "", ( j + k == 4 ) ? "\n" : "" ); return 0; } 不過上面的程式碼拿的資料應該是超出陣列範圍的,這樣的程式碼怪怪的, 所以我就把陣列轉型一下,不過又碰到奇怪的問題 http://pastebin.com/umKP07vX #include <stdio.h> int main() { int n1[1] = {1}, n2[2][2] = {{211, 212}, {221, 222}}, n3[3][3][3] = {{{3111, 3112, 3113}, {3121, 3122, 3123}, {3131, 3132, 3133}}, {{3211, 3212, 3213}, {3221, 3222, 3223}, {3231, 3232, 3233}}, {{3311, 3312, 3313}, {3321, 3322, 3323}, {3331, 3332, 3333}}}; int *ptr[] = {n1, (int*)n2, (int*)n3}; int i, j, k, n = 0; printf( "%d\n", *ptr[0] ); for ( i = 0; i < 2; i++ ) for ( j = 0; j < 2; j++ ) printf( "%d %s", ( (int(*)[2])ptr[1] )[i][j], ( j == 1 ) ? "\n" : "" ); for ( i = 0; i < 3; i++ ) for ( j = 0; j < 3; j++ ) for ( k = 0; k < 3; k++ ) printf( "%d %s%s", ( (int(*)[3][3])ptr[2] )[i][j][k], ( k == 2 ) ? "\n" : "", ( j + k == 4 ) ? "\n" : "" ); return 0; } 我本來是想轉型成陣列的,不過 C 好像不能轉型成陣列,所以就轉成指標了, 不過就像上面的程式碼,如果沒有把 * 括號起來,就會跑出錯誤,錯誤訊息 好像也是說我不能把它轉成陣列,可是加上括號就好了,我不知道為什麼要加 括號,只是看了版上的置底文,跟著做就可以跑了。 我想問的問題是 1.這樣的程式碼是否合理,轉型之後存取的範圍就是正確的? 2.把 * 加上括號跟沒加差在哪? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 175.180.68.25 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1401305656.A.A6F.html ※ 編輯: putumaxally (175.180.68.25), 05/29/2014 03:35:24
karose:這樣的程式碼問題是很難看懂..你為什麼要這樣寫...XD 05/29 14:15
karose:int (*ptr2)[][20] = n2; 用像這樣方式去宣告,比較簡單.. 05/29 14:16
karose:*優先序比[]低,所以拿掉會出錯。 05/29 14:21
karose:你可以把陣列的位址及指標指向的位置全印出,檢查範圍。 05/29 14:37
karose:更正:int (*ptr)[2][2] = n2; 這樣方式。 05/29 14:57
我主要是想放不同維度的陣列在同一個指標陣列裡,位置雖然一但是 array[n*i + j] 跟 array[i][j] 的型別不一樣吧,我第一個程式碼是都轉成一維陣列,第二個程式碼 只是轉型讓他看起來比較合理,只是我不知道這樣算不算是正確的寫法。 ※ 編輯: putumaxally (140.118.196.210), 05/29/2014 18:11:30
Feis:不是正確的寫法. 你的需求不應該用陣列. 陣列元素形態要相同 05/30 00:48
Feis:比較可能的方法是用多型. 05/30 00:49
Feis:不過那不會是你想要的答案 05/30 00:50