当前位置:首页 » 编程语言 » c语言二维数组动态

c语言二维数组动态

发布时间: 2022-09-12 09:57:07

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

既然是动态创建,那么,所创建的二维数组的行、列数应该具有“普适”性,即,应由“用户”确定二维数组的规模。这是有难度的。因为,二维数组要牵扯行指针,且需要固定每行的列元素个数,用这种思路就没有办法达到“普适”。
为此,必须清醒地知道,所谓二维数组,其元素在内存中依然是以一维的方式存放的。说实话,二维数组本质上是不存在的。
既然如此,那么,“构造”一个所谓的二维数组,只要能提供足够实用的函数(工具)操作这个二维数组就可以了。
综上,接受由用户决定的二维数组行、列值,申请一个一维数组的空间,按照二维数组方式进行定位和操作就可以了。
为简便起见,我用如下定义,你可以更改里面的类型,以适应自己的需要:
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;

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

‘贰’ C语言 如何动态创建二维数组

这样的方法可行,不过要是题目要求输入m和n,然后再定义二维数组a[m][n],那就行不通了。
你可以这样做:(以int型为例)
int **a;
int m,n,i;

scanf("%d%d",&m,&n);

a=(int**)malloc(m*sizeof(int*)); /*malloc函数在stdlib.h里面,用的时候加入这个头文件*/
for(i=0;i<m;i++)
a[i]=(int*)malloc(n*sizeof(int));

/*这样以后你就可以把a当作二维数组a[m][n]来用了。。

‘叁’ C语言中如何定义动态二维数组并输出

使用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 = 0; i < 3; ++i){//为每列分配4个大小空间 a[i] = (int*)malloc(sizeof(int)*4); } //初始化 for (i = 0; i < 3; ++i){ for (j = 0; j < 4; ++j){ a[i][j] = i+j; } } //输出测试 for (i = 0; i < 3; ++i){ for (j = 0; j < 4; ++j){ printf ("%d ", a[i][j]); } printf ("\n"); } //释放动态开辟的空间 for (i = 0; i < 3; ++i){ free(a[i]); } free(a); return 0;}/*输出:0 1 2 31 2 3 42 3 4 5*/

‘肆’ C语言如何给用函数二维数组动态赋值

二维数组名不能直接传给二级指针,应该按以下方式使用:
int nChoose;
scanf("%d", &nChoose); // 让用户输入二维数组的大小

int **a = (int **)malloc(nChoose * sizeof(int *));
for (int i = 0; i < nChoose; i ++)
{
a[i] = (int *)malloc(nChoose * sizeof(int));
}

Scan(a, nChoose);
Calc(a, nChoose);

// 最后要释放数组,也要循环

‘伍’ C语言如何动态分配二维数组

动态分配二维数组:

void main(int argc, char * argv[])

{

int NC=100, NR=200;

int i,j;

char **a; // a[NR][NC] -- *a[NR] -- a[j][i]

a = (char **) malloc(sizeof(char *) * NR);

for (j=0;j<NR;j++){

a[j] = (char *) malloc(sizeof(char) * NC);

}

// 释放空间: free(a);

编译错误是因为p[j]=(char *)malloc,而不是题目的(char *)malloc(n*sizeof(char))。

(5)c语言二维数组动态扩展阅读:

二维数组的动态分配

二维数组A[m][n],这是一个m行,n列的二维数组。设a[p][q]为A的第一个元素,即二维数组的行下标从p到m+p,列下标从q到n+q,按“行优先顺序”存储时则元素a[i][j]的地址计算为:

LOC(a[i][j]) = LOC(a[p][q]) + ((i − p) * n + (j − q)) * t

按“列优先顺序”存储时,地址计算为:

LOC(a[i][j]) = LOC(a[p][q]) + ((j − q) * m + (i − p)) * t

存放该数组至少需要的单元数为(m-p+1) * (n-q+1) * t 个字节。

‘陆’ c语言 动态二维数组

int fun(int m,int n)
{

a=(int**)malloc(m*sizeof(int*));
if(a==NULL) return -1;

for(i=0;i<n;i++)
{
a[i]=(int*)malloc(n*sizeof(int));
if(a[i]==NULL) return -1;
}
}
上面的代码来看,明显是误笔了!
for(i=0; i<n; i++) --> for(i=0; i<m; i++)

这样才是对的,因为a的元素个数你申请的是m个,而不是n个。这样的代码,在n<=m的情况下运行是不会出错了,当n>m时,那么就有许多你不可预料的事情发生了!
希望可以帮到你。

‘柒’ C语言中如何定义动态二维数组并输出

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=0;i<m;i++)

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

for(i=0;i<m;i++)

for(j=0;j<n;j++)

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

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

for(i=0;i<m;i++)

{

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

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

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

}

//释放内存

for(i=0;i<m;i++)

free(p[i]);

free(p);


return0;

}

(7)c语言二维数组动态扩展阅读

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

#include

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

{

/* access array */

a[i][j];

}

void main()

{

int a[10][10];

func(10, a);

}

‘捌’ C语言-二维数组动态分配

pArray2=(int**)malloc(sizeof(int*[3])); //分配了3个int*的空间,32地址环境下指针的长度都是32位的也就是4字节,那3个int*就是12字节,和3个int长度是一样的,凑巧而已
也可以写成这样:
pArray2=(int**)malloc(3*sizeof(int*)); //分配3个int*的空间
现在pArray2指向的有效空间内包含3个指针,这3个指针是int*,也就是指向int的指针,这3个指针的值是随机的,还不能用,先要让它们指向合适的空间才行
于是就有:
for(....)
*(pArray2+i)=(int*)malloc(sizeof(int[3])); //这就是给pArray2指向的空间内的3个指针校正方向,让每一个指针指向由3个int整数组成的数组的首地址,这才是最终的数据空间
和pArray2一样,也可以写成:
*(pArray2+i)=(int*)malloc(3*sizeof(int)); //3个int

‘玖’ C语言中二维数组如何申请动态分配内存

1、使用malloc函数,先分配第一维的大小,然后再循环分配每一维的大小。

2、例程,分配3行4列二维数组:

#include<stdio.h>
#include<malloc.h>
intmain()
{
int**a;
inti,j;
a=(int**)malloc(sizeof(int*)*3);//为二维数组分配3行
for(i=0;i<3;++i){//为每列分配4个大小空间
a[i]=(int*)malloc(sizeof(int)*4);
}
//初始化
for(i=0;i<3;++i){
for(j=0;j<4;++j){
a[i][j]=i+j;
}
}
//输出测试
for(i=0;i<3;++i){
for(j=0;j<4;++j){
printf("%d",a[i][j]);
}
printf(" ");
}
//释放动态开辟的空间
for(i=0;i<3;++i){
free(a[i]);
}
free(a);
return0;
}
/*
输出:
0123
1234
2345
*/
热点内容
网络登录服务器需要获取什么信息 发布:2025-01-12 12:17:32 浏览:890
mac终端打开文件夹 发布:2025-01-12 12:17:31 浏览:295
第一次安装如何设置mysql密码 发布:2025-01-12 12:09:02 浏览:280
如何删除微信服务器上收藏 发布:2025-01-12 12:08:20 浏览:102
吃鸡游戏安卓区转苹果区怎么转 发布:2025-01-12 11:34:00 浏览:880
网页版c语言 发布:2025-01-12 11:21:01 浏览:864
安卓怎么更改排位常用英雄 发布:2025-01-12 11:10:33 浏览:561
拆迁的100万如何配置 发布:2025-01-12 11:08:52 浏览:575
如何配置ph值为次氯酸钠的ph值 发布:2025-01-12 11:08:52 浏览:437
pythonarraynumpy 发布:2025-01-12 11:01:47 浏览:293