在C语言中可将一个二维数组看成是由若干一维数组构成的。如:
int a[3][4];
首先,可将二维数组a看成是由a[0],a[1],a[2]三个元素组成的一维数组,a是该一维数组的数组名,代表该一维数组的首地址,即第一个元素a[0]的地址(&a[0])。所以*(a+i)
即为a[i]
,注意这里所谓的元素a[0],a[1],a[2]事实上仍然是个地址。
其次,可以将a[0],a[1],a[2]分别看成是由4个int型元素组成的一维数组元素的数组名,如a[0]就可以看成由元素a[0][0]
,a[0][1]
,a[0][2]
,a[0][3]
,这4个整型元素组成的一维数组。a[0]就是这个一维数组的数组名,它代表该一维数组的首地址,即第一个元素a[0][0]
的地址(&a[0][0]
),则a[0]+i表示a[0][i
的地址(&a[0][i]
)。因此*(a[0]+i)
即为a[0][i
。同时,a[i]即*(a+i)
可以看成一维数组a的下标为i的元素。根据以上分析可知a[i]+j及*(a+i)+j
代表这个数组中下标为j的元素地址,即&a[i][j]
,*(a[i]+j)
即*(*(a+i)+j)
就代表这个地址所指向的元素的值,即a[i][j]
。因此,以下4种表示元素a[i][j]
的形式是等价的:
a[i][j]
*(a[i]+j)
*(*(a+i)+j)
(*(a+i))[j]
行指针:使用二维数组的行地址进行初始化。
一般格式:类型关键字 (*行指针名)[常量N];
其中,常量N定义行指针所指一维数组的长度。
通过行指针p引用二维数组的方法可以有以下4种形式:
p[i][j]
*(p[i]+j)
*(*(p+i)+j)
(*(p+i))[j]
例如:
# include <stdio.h>
int main(void)
{
int a[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
int i, j;
int (*p)[4] = a; //行指针初始化格式
for (i=0; i<3; ++i)
{
for (j=0; j<4; ++j)
{
printf("%-2d\x20", *(*(p+i)+j));
}
printf("\n");
}
return 0;
}
输出结果:
1 2 3 4
5 6 7 8
9 10 11 12
列指针:使用二维数组的列地址进行初始化。
定义列指针p后,为了能通过p引用二维数组元素a[i][j]
,可将数组a看成一个由m行*
n列个元素组成的一维数组。因此,p+i*n+j
代表数组的第i行第j列的地址,即&a[i][j]
,于是,通过列指针p引用二维数组a[i][j]
的方法可以有以下两种形式:
*(p+i*n+j)
p[i*n+j]
例如:
# include <stdio.h>
int main(void)
{
int a[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
int i, j;
int *p = &a[0][0]; //列指针初始化格式,把a[0][0]的地址赋给指针变量p
for (i=0; i<3; ++i)
{
for (j=0; j<4; ++j)
{
printf("%-2d\x20", *(p+i*4+j));
}
printf("\n");
}
return 0;
}
输出结果:
1 2 3 4
5 6 7 8
9 10 11 12
参考文献:C语言大学实用教程