在理解二級指標與二維陣列的關係時,我們先來回顧一下一維陣列與指標的關係:一維陣列是由已知數目的相同型別的元素組合而成,每個元素依次連續排列在記憶體某乙個空間中,因此每相鄰兩個元素的位址相差為同乙個常數。陣列名就是該陣列的位址,陣列取第乙個元素的位址作為位址。此時我們可以用指標訪問一維陣列。實現過程如下:
#includeint main(void)
; int* p=null;
int i=0;
p=a;
printf("&a[i]:");
for(i=0;i<3;++i)
printf("%d ",&a[i]);
printf("\np+i:");
for(i=0;i<3;++i)
printf("%d ",p+i);
printf("\na[i]:");
for(i=0;i<3;++i)
printf("%d ",a[i]);
printf("\np[i]:");
for(i=0;i<3;++i)
printf("%d ",p[i]);
printf("\n*(p+i):");
for(i=0;i<3;++i)
printf("%d ",*(p+i));
return 0;
}
&a[i]:921511572 921511576 921511580
p+i:921511572 921511576 921511580
a[i]:0 0 0
p[i]:0 0 0
*(p+i):0 0 0
從上面我們可以得出一些結論:&a[i]與p+i等價,p[i]與a[i]與(*(p+i))等價。且在數值上a=&a[0], a[i]=*(p+i)
現在我們來回顧二維陣列:
#include int main(void)
, ,
};for(i = 0 ; i < 3; ++i)
for(j=0;j<3;++j)
printf(" board[%d][%d]: %c\n", i,j,*(*(board+i)+j));
return 0;
}
執行結果:
board[0][0]: 1 board[0][1]: 2 board[0][2]: 3
board[1][0]: 4 board[1][1]: 5 board[1][2]: 6
board[2][0]: 7 board[2][1]: 8 board[2][2]: 9
此時在數值上*board=board=board[0] = &board[0][0]=&board[0]=第乙個元素的位址。board[0]相當於是每乙個一維陣列的陣列名!
那麼用malloc建立的「二維陣列」是否具有這樣的特性嗎?
malloc建立「二維陣列」的實現過程如下:
#include #includeint main(void)
, ,
};for(i = 0 ; i < 9; ++i)
printf(" board: %c\n",*(*board+i)); //board一定要加星號!*board相當於是*(board+0)=board[0]
return 0;
}
執行結果:
board[0][0]: 1 board[0][1]: 2 board[0][2]: 3
board[1][0]: 4 board[1][1]: 5 board[1][2]: 6
board[2][0]: 7 board[2][1]: 8 board[2][2]: 9
二維陣列與二級指標
今日在論壇上看到有人問到指標 級指標和二維陣列 我們知道char array abcdef array是陣列的首位址,那麼在二維陣列中array當然也是陣列的首位址,看看這個定義char array 3 怎麼知道的呢?定義這樣乙個陣列,在vc除錯視窗中 我們看到 array 0x64324234 a...
二級指標與二維陣列
include 輸入輸出標頭檔案。include 本程式需要用到malloc free函式,引用該標頭檔案。int main 定義二維陣列a,並賦值從1 12.int p null 定義二維指標。int i,j p int malloc sizeof int 3 要訪問的陣列有三行,所以申請三個一維...
二維陣列與二級指標
首先,記憶體是連續的,二維陣列中的資料塊在記憶體中也是一塊連續的順序的儲存的空間。二維陣列名相當於指標,但是它指向的是乙個陣列型別。int a 4 5 那麼二維陣列a 在記憶體中的分配應該是順序分配 5 5 5 5 此處 5 表示乙個長度為5的一維陣列 二維陣列名 a 指向一維陣列a 0 a相當於乙...