无论几维数组,在内存中的存储都是顺序存储了,二维数组只是我们自己抽象的出来一个数据结构。
下面代码用到了结构体做为操作对象,函数作为方法自我定义了类二维数组的数据结构。
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <stdbool.h>
#include <assert.h>
typedef struct {
int totalnum;//二维数组元素个数
int rows;//行
int cols;//列
int *data;//存放数据的一维数组
}Arr2D;
#define OVERFLOW -1
//初始化二维数组
void InitArr2D(Arr2D *obj,int rows, int cols, int totalnum,bool isinit/*是否初始化为0*/)
{
assert(rows > 0 && cols > 0 && totalnum > 0);//
assert(rows*cols == totalnum);//行列的乘积要等于总元素个数
obj->data = malloc(sizeof(int)*totalnum);
assert(obj->data != NULL);
if(isinit)
memset(obj->data, 0, sizeof(obj->data));
obj->rows = rows;
obj->cols = cols;
obj->totalnum = totalnum;
}
//给二维数值赋值
void SetValueArr2D(Arr2D *obj, int rows, int cols, int val)
{
assert(obj != NULL);
int index = rows * obj->cols + cols;
if (index < obj->totalnum)
obj->data[index] = val;
else
printf("the index is overflow for your Arr2D!\n");
}
//获取指定二维数据的值
int GetValueArr2D(Arr2D *obj, int rows, int cols)
{
assert(obj != NULL);
int index = rows * obj->cols + cols;
if (index < obj->totalnum)
{
return obj->data[index];
}
else
{
printf("the index is overflow for your Arr2D!\n");
return OVERFLOW;
}
}
//销毁创建的对象
void DestoryArr2D(Arr2D *obj)
{
assert(obj != NULL);
if (obj->data != NULL)
free(obj->data);
obj->data = NULL;
}
//打印对象
void PrintArr2D(Arr2D *obj)
{
assert(obj != NULL);
for (int i = 0; i < obj->rows; i++)
{
for (int j = 0; j < obj->cols; j++)
{
printf("%d ", GetValueArr2D(obj, i, j));
}
printf("\n");
}
}
void main()
{
Arr2D a1;
InitArr2D(&a1, 3, 4, 12, true);
int a = GetValueArr2D(&a1, 0, 0);
//初始化定义出来的对象。测试用例
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 4; j++)
SetValueArr2D(&a1, i, j, i + j);
}
//打印初始化后的对象。
PrintArr2D(&a1);
DestoryArr2D(&a1);
system("pause");
return ;
}