为此,必须清醒地知道,所谓二维数组,其元素在内存中依然是以一维的方式存放的。说实话,二维数组本质上是不存在的。
既然如此,那么,“构造”一个所谓的二维数组,只要能提供足够实用的函数(工具)操作这个二维数组就可以了。
综上,接受由用户决定的二维数组行、列值,申请一个一维数组的空间,按照二维数组方式进行定位和操作就可以了。
为简便起见,我用如下定义,你可以更改里面的类型,以适应自己的需要:
typedef int USER_TYPE
// 定义一个控制二维数组(矩阵)的“控制头”,由三个成员组成
typedef struct MATRIX
{
USER_TYPE *data // 真正用来存储二维数组元素的空间
int Row // 二维数组行数
int Col // 二维数组列数
}MATRIX
MATRIX *initMatrix(int row, int col) // 初始化二维数组
USER_TYPE getElementAt(MATRIX matrix, int i, int j)// 取得指定下标的元素
void setElementAt(MATRIX matrix, int i, int j, USER_TYPE val)// 给指定下标的元素赋值
void destroyMatrix(MATRIX *matrix)// 销毁二维数组
void destroyMatrix(MATRIX *matrix)
{
free(matrix->data)
free(matrix)
}
void setElementAt(MATRIX matrix, int i, int j, USER_TYPE val)
{
matrix.data[i*matrix + j] = val
}
USER_TYPE getElementAt(MATRIX matrix, int i, int j)
{
return matrix.data[i*matrix.Col + j]
}
MATRIX *initMatrix(int row, int col)
{
MATRIX *mp
mp = (MATRIX *)malloc(sizeof(MATRX))
mp->data = (USER_TYPE *)malloc(sizeof(USER_TYPE) * row * col)
mp->Row = row
mp->Col = col
return mp
}
把上面的函数当成工具,完成二维数组初始化、赋值、取值等一系列操作,如果需要比较,还需要编写比较的函数。
使用malloc函数,先分配第一维的大小,然后再循环分配每一维的大小。示例代码,分配3行4列二维数组:
#include <stdio.h>#include <malloc.h>int main(){int **a int i, j a = (int**)malloc(sizeof(int*)*3)//为二维数组分配3行for (i = 0i <3++i){//为每列分配4个大小空间a[i] = (int*)malloc(sizeof(int)*4) }//初始化for (i = 0i <3++i){for (j = 0j <4++j){a[i][j] = i+j }}//输出测试for (i = 0i <3++i){for (j = 0j <4++j){printf ("%d ", a[i][j]) }printf ("\n") }//释放动态开辟的空间for (i = 0i <3++i){free(a[i]) }free(a) return 0}/*输出:0 1 2 31 2 3 42 3 4 5*/