下午学习时遇到了二维数组的相关问题,写此博客记录一下,说不定以后还会用到。
对于二维数组来说:
int a[3][4] = { { 1, 4, 5, 8 },
{ 9, 19, 20, 18 },
{ 17, 20, 35, 23 } };
一、a[0][0]为第一个元素,那么取地址后&a[0][0]为第一个元素的地址;
二、a[0]为第一行的首地址;
三、二维数组名a的值为首地址;
四、对a解引用后*a为a[0],为第一行的首地址;
故a,a[0],*a,&a[0][0]均相等,为首地址
延伸:
我们知道若 int a=0; int *p=&a; 则输出p得到的是地址,输出p+1得到的是之前的结果再加4,因为int 占4字节;对p加一实际上是在内存中加4字节。
对于二维数组a[3][4]来说:
a+0的值为第一行的首地址,a+1的值为第二行的首地址,a+2的值为第三行的首地址;
*(a+0)为a[0],为第一行的首地址;*(a+1)为a[1],为第二行的首地址;*(a+2)为a[2],为第三行的首地址;
也就是说a+i,*(a+i),a[i]三者的值是相等的(i=0,1,2,3......)
那么用*(*(a+i)+j)就可以找到第i+1行,第j+1列的值(因为i,j是从0开始的,行列是从一开始的)
举例:
int main()
{
int a[3][4] = { { 1, 3, 5, 7 },
{ 9, 11, 13, 15 },
{ 17, 19, 21, 23 } };/* cout << a << " " <<*a<<" "<< a[0] << " " << &a[0][0];*/
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 4; j++)
{
cout << *(*(a + i) + j) << endl;
}
}
return 0;
}