二维数组应该是一种最常用的数据结构了,二维相对一维,确实复杂了不只一个维度。
二维数组是数组的数组,其元素是一个数组,如果用指针指向,需要有长度信息,才可以用正常的指针算术运算(元素指针偏移)。
1 行序优先、列序优先,倒序处理,对角线数据处理
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i,j;
int row = 3;
const int COL = 4;
int arr[][COL] = {1,2,3,4,5,6,7,8,9,10,11,12};
for(i=0;i<row;i++) // 行序优先
{
for(j=0;j<COL;j++)
printf("%2d ",arr[i][j]);
printf("\n");
}
for(i=0;i<COL;i++) // 列序优先
{
for(j=0;j<row;j++)
printf("%2d ",arr[j][i]);
printf("\n");
}
for(i=row-1;i>=0;i--) // 倒序输出
{
for(j=COL-1;j>=0;j--)
printf("%2d ",arr[i][j]);
printf("\n");
}
int sum = 0;
for(i=0;i<row;i++) // 对角线数据求和
{
sum += arr[i][i] + arr[i][row-i-1];
}
printf("%d\n",sum);
getchar();
return 0;
}
/*output:
1 2 3 4
5 6 7 8
9 10 11 12
1 5 9
2 6 10
3 7 11
4 8 12
12 11 10 9
8 7 6 5
4 3 2 1
36
*/
2 二维指针处理二维数组
首先需要注意的是,二维指针的解引用是一个指针,二维数组名的元素是一个有长度信息的数组,二者不具有等同性,可以有关联性。
#include <stdio.h>
#include <stdlib.h>
#define COL 4
int** func2P(int row)
{
int i,j;
int**pp = (int**)malloc(sizeof(int*)*row);
for(i=0;i<row;i++)
pp[i] = (int*)malloc(sizeof(int)*COL);
for(i=0;i<row;i++)
for(j=0;j<COL;j++)
pp[i][j] = (i+1)*(j+1);
return pp;
}
int main()
{
int row = 3;
int**arr = func2P(row);
for(int i=0;i<row;i++)
{
for(int j=0;j<COL;j++)
printf("%2d ",arr[i][j]);
printf("\n");
}
free(arr);
getchar();
return 0;
}
/*output:
1 2 3 4
2 4 6 8
3 6 9 12
*/
3 数组指针处理二维数组
#include <stdio.h>
#include <stdlib.h>
#define COL 4
int(*funcArr2D(int row))[COL] // 返回一个数组指针
{
int (*buf)[COL];
buf = (int(*)[COL])malloc(row*COL*sizeof(int)); // malloc(row); ?
for(int i=0;i<row;i++)
for(int j=0;j<COL;j++)
buf[i][j] = (i+1)*(j+1);
return buf;
}
int main()
{
int row = 3;
int(*arr)[4] = funcArr2D(row);
for(int i=0;i<row;i++)
{
for(int j=0;j<COL;j++)
//printf("%2d ",arr[i][j]);
printf("%2d ",*(*(arr+i)+j));
printf("\n");
}
free(arr);
getchar();
return 0;
}
/*output:
1 2 3 4
2 4 6 8
3 6 9 12
*/
如果是C++,也可以使用数组指针获得一个二维数组:
void test()
{
int (*a)[6] = new int[5][6];
for(int i=0;i<5;i++)
for(int j=0;j<6;j++)
a[i][j] = (i+1)*(j+1);
}
4一维数组和二维数组相互赋值
内存本质上是一个顺序存储的线性字节数组。二维数组只是逻辑上的概念,本质上是数组的数组。
#include <stdio.h>
#include <stdlib.h>
#define COL 4
int(*funcArr2D(int row))[COL]
{
int (*buf)[COL];
buf = (int(*)[COL])malloc(row*COL*sizeof(int)); // malloc(row); ?
for(int i=0;i<row;i++)
for(int j=0;j<COL;j++)
buf[i][j] = (i+1)*(j+1);
return buf;
}
int* func1P(int row)
{
int* p = (int*)malloc(sizeof(int)*row*COL);
for(int i=0;i<row*COL;i++)
p[i] = i+1;
return p;
}
int main()
{
int row = 3;
int(*arr2)[4] = funcArr2D(row);
int* arr1 = func1P(row);
for(int i=0;i<row*COL;i++)
arr2[i/COL][i%COL] = arr1[i];
for(i=0;i<row;i++)
{
for(int j=0;j<COL;j++)
printf("%2d ",arr2[i][j]);
printf("\n");
}
free(arr2);
free(arr1);
getchar();
return 0;
}
/*output:
1 2 3 4
2 4 6 8
3 6 9 12
*/
5 使用指针数组处理二维数组
#include <stdio.h>
int main()
{
int b[2][3]= {{1,2,3},{2,4,6}};
int *pb[2];
int i,j;
pb[0]=b[0];
pb[1]=b[1];
for(i=0; i<2; i++)
{
for(j=0; j<3; j++,pb[i]++)
printf("%2d",*pb[i]);
printf("\n");
}
return 0;
}
-End-