对于一个二维数组a[m][n],虽然在内存中是线性排列的,但是我们可以想象成一个m行n列的二维矩阵。
假设我们声明并初始化了一个整形二维数组a[4][3]
int a[3][4] = {{1,2,3,4},{2,3,4,5},{4,5,6,7}};
我们通过取值运算符得到每个元素的地址(&a[i][j])
for(int i=0; i<3;i++)
{
for(int j=0;j<4;j++)
{
cout<<&a[i][j]<<' ';
}
cout<<endl;
}
因为整形是4个字节的,所以每个元素之间相差4个字节。
001CFB04 001CFB08 001CFB0C 001CFB10
001CFB14 001CFB18 001CFB1C 001CFB20
001CFB24 001CFB28 001CFB2C 001CFB30
如果我们用矩阵来表的话(把上面的&去掉)
1 2 3 4
2 3 4 5
4 5 6 7
假设我们要取某个位置的值,可以有两种方法:
/* 我们要取第二行第三个数
因为数组是从0开始计数的
因此对应于(1,2)
*/
int value1 = a[1][2]; //用中括号
int value2 = *(*(a+1)+2); //用指针
所以,我们可以得到一个等价公式:
a[i][j] === *( * ( a + i ) + j )
对二维数组初始化:
int b[][5] = { {1,2,3,4,5},{2,3,4,5,6},...}; //可以不指定具体行数,但是必须指定列数