在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语言大学实用教程
本文深入探讨了C语言中二维数组的多种表示方法,包括行指针和列指针的使用,以及如何通过不同方式访问二维数组的元素,提供了丰富的代码示例。
2197

被折叠的 条评论
为什么被折叠?



