看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《vaca1 (無聊人)》之銘言: : 小弟看了書 也查了很多網路的資料~ : 一般都是大同小異 也找到很多範例的code.. : 基本觀念就是要建立一個"指標的陣列" : 以下是一段範例code : int main() : { : const int sizex = 3; : const int sizey = 2; : int x, y; : int **ia = (int **)malloc(sizey * sizeof(void *) + 等於sizeof(int*) : sizey * sizex * sizeof(int *)); 多了 * : int *iax = (int*)(ia + sizex); ^^^^^ 這裡應該是sizey才對 : for(y = 0; y != sizey; ++y, iax+=sizex) : ia[y] = iax; : } 上面的code是為了把兩次malloc降成一次 等同下面的code int **ia = (int**)malloc(sizey*sizeof(int*)); int *iax = (int*)malloc(sizey*sizex*sizeof(int)); 另外我寫了一個範例 #include<stdio.h> #include<stdlib.h> int main() { const int sizex = 3; const int sizey = 2; int x, y; int **ia = (int **)malloc(sizey * sizeof(int*) + //這裡sizeof(int *)等於8(這結果隨電腦而異) sizey * sizex * sizeof(int)); int *iax = (int*)(ia + sizey); for(y = 0; y != sizey; ++y, iax+=sizex) ia[y] = iax; /* for是在建立開頭的index 如果沒做的話 這時的ia[y]沒初始化 &ia[y][x]會是不合法的address(把值印出來就知道了) 執行下去就會出錯 執行for以前的記憶體 執行for以後的記憶體(這裡的iax是指之前的iax) ia ia ↓ ↓ ----- ----- int * int *=iax &ia[0] ----- ----- int * int *=iax+3 &ia[1] ----- ----- int ←iax int=10 ←iax &ia[2] ----- ----- int int ----- ----- int int &ia[3]跳過上一格是因為sizeof(int *)=8 ----- ----- int int ←iax+3 ----- ----- int int=11 &ia[4] ----- ----- int int ----- ----- */ ia[0][0]=10; printf("%d=%d=%d\n",*(ia[0]),ia[2],ia[0][0]); ia[1][1]=11; printf("%d=%d=%d\n",*(ia[1]+1),ia[4],ia[1][1]); free(ia); /*正確輸出: 10=10=10 11=11=11 */ } --------------------------------------------------- 如果在sizeof(int *)=4的環境要怎麼改 可以嘗試一下 ~ ~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.134.226.149
diabloevagto:寫的清楚好懂了!建議在學習陣列的時候畫表格理解 05/31 23:42
christianSK:同意樓上 畫畫圖可以幫助理解 05/31 23:55
※ 編輯: loveflames 來自: 140.134.226.149 (06/01 02:20)
ilovebbs:咦.我用CB,ia[6]才會是10,4是sizeof(int*) = 8的關係? 06/01 11:21
ilovebbs:&ia[3]跳過上一格是因為sizeof(int *)=8 不太懂.囧" 06/01 11:22
loveflames:因為每一格都差4 06/01 11:51
ilovebbs:OTL...理解不能.. 06/01 14:16
loveflames:把&ia[x]印出來看吧 06/01 14:18
ilovebbs:喔喔..突然間了解了 06/01 14:36
vaca1:感謝你非常詳細的解說! 06/01 15:33
hichcock:說的很詳細,給推一下 06/02 10:36