c语言如何动态创建二维数组

Python011

c语言如何动态创建二维数组,第1张

既然是动态创建,那么,所创建的二维数组的行、列数应该具有“普适”性,即,应由“用户”确定二维数组的规模。这是有难度的。因为,二维数组要牵扯行指针,且需要固定每行的列元素个数,用这种思路就没有办法达到“普适”。

为此,必须清醒地知道,所谓二维数组,其元素在内存中依然是以一维的方式存放的。说实话,二维数组本质上是不存在的。

既然如此,那么,“构造”一个所谓的二维数组,只要能提供足够实用的函数(工具)操作这个二维数组就可以了。

综上,接受由用户决定的二维数组行、列值,申请一个一维数组的空间,按照二维数组方式进行定位和操作就可以了。

为简便起见,我用如下定义,你可以更改里面的类型,以适应自己的需要:

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

}

把上面的函数当成工具,完成二维数组初始化、赋值、取值等一系列操作,如果需要比较,还需要编写比较的函数。

intmain()

{

int**p//定义二维指针。

intm,n//行数和列数。

inti,j

scanf("%d%d",&m,&n)//输入行数和列数。

if(m<=0||n<=0)return-1//行数或列数非法。

p=(int**)malloc(sizeof(int*)*m)//申请一组一维指针空间。

for(i=0i<mi++)

p[i]=(int*)malloc(sizeof(int)*n)//对于每个一维指针,申请一行数据的空间。

for(i=0i<mi++)

for(j=0j<nj++)

scanf("%d",&p[i][j])//输入第i行第j列的数据。其中&p[i][j]也可以写作p[i]+j或者是*(p+i)+j.功能相同。

printf("输入的数组为%d行%d列:\n",m,n)

for(i=0i<mi++)

{

for(j=0j<nj++)//这个循环可以输出一行元素。

printf("%d",p[i][j])//输出i行j列的元素。

printf("\n")//每行输入结束加换行符。

}

//释放内存

for(i=0i<mi++)

free(p[i])

free(p)

return0

}

扩展资料

c语言中通过函数传递二维数组

#include

void func(int n, int a[][size])

{

/* access array */

a[i][j]

}

void main()

{

int a[10][10]

func(10, a)

}