如何定义动态二维数组

大家好,今天Win10系统之家小编给大家分享「如何定义动态二维数组」的知识,如果能碰巧解决你现在面临的问题,记得收藏本站或分享给你的好友们哟~,现在开始吧!

1.C语言中如何定义动态二维数组并输出


  可以按照下面步骤进行定义二维数组并输出:
1 定义二维指针。
2 确定数组维数,即行数和列数。
3 申请行数个一维指针大小空间,并赋值给二维指针。
4 对于每个一维指,申请列数个元素的空间,并赋值给对应的一维指针。
5 输入或赋值数据。
6 使用双重循环,逐个范围存储单元并输出。
7 逐个释放一维指针上的内存。
8 释放二维指针上的内存。
以整型二维数组为例:
下面的代码,实现先输入二维数组的行数m和列数n,并再输入m*n个整型数据存到动态二维数组中。最后输出所有二维数组的元素值。
#include <stdio.h> //包含输入输出函数
#include <stdlib.h>//包含动态内存分配函数。
int main()
{
 int **p; //定义二维指针。
 int m, n;//行数和列数。
 int i,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列:\n", m, n);
 for(i = 0; i < m; i ++)
 {
 for(j = 0; j < n; j ++)//这个循环可以输出一行元素。
 printf("%d ", p[i][j]);//输出i行j列的元素。
 printf("\n");//每行输入结束加换行符。
 }
 //释放内存
 for(i = 0; i < m; i ++)
 free(p[i]);
 free(p);
 return 0;
}

2.如何定义一个动态的数组?


  利用这一特性定义一个指针数组。
int **p= new int*[size];//定义指针数组 
  
int *p[5];//  假若知道二维数组的行数为5
  
然后对指针数组中的每一个指针分配一个一维数组空间,这样便动态定义了二维数组
  
事实上,我认为指针数组的主要用途,就在于动态定义多维数组
  
for(int i=0;i<size;i++)
  
{
  
p[i]=new int[Column];
  
}
  
运行完毕后,一个二维数组便被动态的成功建立。
  
  动态数组,是相对于静态数组而言。静态数组的长度是预先定义好的,在整个程序中,一旦给定大小后就无法改变。而动态数组则不然,它可以随程序需要而重新指定大小。动态数组的内存空间是从堆(heap)上分配(即动态分配)的。是通过执行代码而为其分配存储空间。当程序执行到这些语句时,才为其分配。程序员自己负责释放内存。
  为什么要使用动态数组?
  在实际的编程中,往往会发生这种情况,即所需的内存空间取决于实际输入的数据,而无法预先确定。对于这种问题,用静态数组的办法很难解决。为了解决上述问题,C语言提供了一些内存管理函数,这些内存管理函数结合指针可以按需要动态地分配内存空间,来构建动态数组,也可把不再使用的空间回收待用,为有效地利用内存资源提供了手段。
  动态数组与静态数组的对比
  对于静态数组,其创建非常方便,使用完也无需释放,要引用也简单,但是创建后无法改变其大小是其致命弱点!
  对于动态数组,其创建麻烦,使用完必须由程序员自己释放,否则严重会引起内存泄露。但其使用非常灵活,能根据程序需要动态分配大小。

3.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;
}
把上面的函数当成工具,完成二维数组初始化、赋值、取值等一系列操作,如果需要比较,还需要编写比较的函数。

以上就是关于「如何定义动态二维数组」的全部内容,本文讲解到这里啦,希望对大家有所帮助。如果你还想了解更多这方面的信息,记得收藏关注本站~

【此*文为Win10系统之家文♂章,转载请注明出处!】

精彩推荐

推荐软件

COPYRIGHT @2016 ALL RIGHTS RESERVED

本站点上的所有软件和资料均为软件作者提供和网友推荐收集整理而来,仅供学习和研究使用。如有侵犯你版权的,请来信227228@qq.com指出,本站将立即改正。

首页 电脑版 顶部