摘要: 二维数组在我们学习c语言的时候遇到过,现在我们来试试用数据结构对二维数组进行操作,并且顺便看看c语言是如何给二维数组分配空间的
一.代码块
1)创建
这里分为了静态和动态两个写法,由于静态操作比较简单,我们后续的函数用的动态。
#define ROWS 4
#define COLUMNS 5
/*这种用一个指针指向一个地址表示一个数组的方式我们之前都用过了
,可以体现出动态性,不过要给他动态分配空间,不然就只有一个首地址,
没有结尾了。这里要表示二维数组,就用两个*号就可以了*/
typedef struct twoDArray
{
int rows;
int columns;
int **elements;
}*towDArrayPtr;
//这种静态分配不用单独给数组malloc,由于这种比较简单,我们后续的都用的第一种
typedef struct twoDStaticArray
{
int rows;
int columns;
int elements[ROWS][COLUMNS];
}*twoDStaticArrayPtr;
2)初始化
在开始初始化函数之前,我们要知道一件事情:对于c语言来说,二维数组其实就是一个一维数组,只不过这个一维数组的每个元素又分别是一个一维数组。同理推广到三维数组甚至更高维。其次,c语言的的二维数组是以行序为主序的,即相当于二维数组的每一行单独是一个大的元素,第一行为第一个元素,第二行为第二个元素。
towDArrayPtr twoDArrayInit(int paraRows,int paraColumns)
{
int i;
//首先先给结构体 malloc
towDArrayPtr resultTwoDArray = (towDArrayPtr)malloc(sizeof(struct twoDArray));
resultTwoDArray->rows = paraRows;
resultTwoDArray->columns = paraColumns;
//对于二维数组,先给最外层malloc
resultTwoDArray->elements = (int**)malloc(paraRows * sizeof(int*));
//然后,在对我们说的每一行的大元素malloc,空间就是每一行元素的个数,即列数
for(i = 0;i < resultTwoDArray->rows;i ++)
{
/*其实,对于二维数组来说,只用一个下标呢就相当于每个元素都是一整行的大元素*/
resultTwoDArray->elements[i] = (int*)malloc(paraColumns * sizeof(int));
}
return resultTwoDArray;
}
3)打印
void outputTwoDArray(towDArrayPtr paraPtr)
{
int i,j;
for(i = 0;i < paraPtr->rows;i ++)
{
for(j = 0;j < paraPtr->columns;j ++)
{
printf("%d ",paraPtr->elements[i][j]);
}
printf("\n");
}
printf("\r\n");
}
4)随机赋值
void randomizeTwoDArray(towDArrayPtr paraPtr, int paraLowerBound, int paraUpperBound)
{
int i, j;
//这里就是一个随机函数,在stdlib头文件里面,给定上下界然后给每个元素赋随机值
for (i = 0; i < paraPtr->rows; i ++)
{
for (j = 0; j < paraPtr->columns; j ++)
{
paraPtr->elements[i]