二维数组的四种遍历方式:
a[i][j] *(a[i]+j) *(*(a+i)+j) *(&a[0][0]+i*n+j)
1.a[i][j] : 这种方法是最基本的方式。
2.*(a[i]+j) :(a[i]+j)是下标为(i,j)的地址,通过‘ * ’运算就取得下标为(i,j)的元素值。
3.*(*(a+i)+j) :这种方式可能是大家最迷惑的方式,其实并不难理解,下面我们来详细讲解:
假如有一个二维数组: int a[3][4] = {{1, 3, 5, 7}, {9, 11, 13, 15}, {17, 19, 21, 23}};
其中,a 是二维数组名。a 数组包含 3 行,即 3 个行元素:a[0],a[1],a[2]。
每个行元素都可以看成含有 4 个元素的一维数组。而且 C 语言规定,a[0]、a[1]、a[2]分别是这三个一维数组的数组名。
如下所示:
而在C语言遍历一维数组的四种方式(点击转到该文章)一文中a[i]与*(a+i)是等价的,也就是说 a[i]=*(a+i)
所以第三种方式就等价于第二种方式了,就能成功进行二维数组的遍历了。
4.*(&a[0][0]+i*n+j) :
&a[0][0]是二维数组的首地址,i是行数,n是每行元素个数,故&a[0][0]+i*n+j就是下标为(i,j)的地址,通过‘ * ’运算就取得下标为(i,j)的元素值。
5.若有指针p指向该数组的开始位置,还可以用*(p+i*n+j) (此方式大家自行测试)。
c语言测试代码:
/*Function:二维数组的四种遍历方式:a[i][j],*(a[i]+j),*(*(a+i)+j),*(&a[0][0]+i*n+j) */
#include <stdio.h>
void main(){
int i,j;
int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};
printf("方式一:a[i][j]\n"); //方式一
for(i=0;i<3;i++){
for(j=0;j<3;j++){
printf("%d",a[i][j]);
}
}
printf("\n方式二:*(a[i]+j)\n"); //方式二
for(i=0;i<3;i++){
for(j=0;j<3;j++){
printf("%d",*(a[i]+j));
}
}
printf("\n方式三:*(*(a+i)+j)\n"); //方式三
for(i=0;i<3;i++){
for(j=0;j<3;j++){
printf("%d",*(*(a+i)+j));
}
}
printf("\n方式四:*(&a[0][0]+i*3+j)\n"); //方式四
for(i=0;i<3;i++){
for(j=0;j<3;j++){
printf("%d",*(&a[0][0]+i*3+j));
}
}
printf("\n");
}
执行结果: