原文链接:https://blog.csdn.net/xiang_shao344/article/details/99684395
一、用 new 来动态开辟一个二维数组
int **p = new int*[m]; //m行n列型
for (i = 0; i < m; ++i) {
p[i] = new int[n];
for (j = 0; j < n; ++j)
scanf ("%d",&p[i][j]);
}
二、用vector来动态开辟一个二维数组
首先介绍一下容器的方法:a.resize()方法使用:
a.resize(n):如果n>a.size(),则在a.end()之前插入n-a.size()个元素;否则,删除第n个元素之后的所有元素。
a.resize(n,t): 如果n>a.size(), 则在a.end()之前插入 t 的n-a.size()个拷贝;否则,删除第n个元素之后的所有元素。
方法一:
vector > a;
a.resize(row, vector(column));
方法二:
vector > a(row, vector(column)); //默认用0初始化
//vector > a(row, vector(column,-1));//用-1初始化二维数组
注:如果row > a.size(),则在a.end()之前插入vector(column)的row次拷贝,相当于row行column列
方法三:
vector > a;
a.resize(row);
for (int i = 0; i < row; ++i)
a[i].resize(column);
本文链接:https://blog.csdn.net/u014546553/article/details/53644898
1、用new申请一块内存空间存放二维数组
#include
using namespace std;
int main(int argc, char* argv[])
{
int n=10,m=2; //
int **swp; //动态申请二维数组 n行 m列
swp=new int*[n];
for(int i=0;i
2、用变量定义二维数组的长度
int lineCnt=100;
int **dian_point=(int **)malloc(sizeof(int) * (lineCnt+1));//用变量lineCnt定义scan数组的行数 针对二维数组
// int f=4;//定义scan数组的列数
for(int i=0;i
3、使用vector创建一个二维数组
int n=10,m=2; //
vector > swp(n);//表示二维数组有 4行 后面两个> >中间的空格不能省略
for(int i=0;i
方法3中,,上面多写了三行,就是为了指定 数组swp的列数。 今天才发现,可以用更简单的方法完成上面的工作 ,
下面的一行就可以代替上面的四行
vector >swp(n,vector(m));//定义二维数组swp[][],n行 m列
本文链接:https://blog.csdn.net/u011501096/article/details/20994919
先说说memset函数:
void *memset(void *s,int c,size_t n)
作用:将已开辟内存空间 s 的首 n 个字节的值设为值 c。
memset()的内涵:用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ ’或‘/0’;例:char a[100];memset(a, '/0', sizeof(a));
memset() 函数常用于内存空间初始化。如:
char str[100];
memset(str,0,sizeof(str));
先说说一维数组的动态分配和初始化:
一维数组的动态分配,初始化和撤销比较简单,如下所示:
动态分配: int *array=new int [10];//动态分配10个空间
初始化:memset(array,0,sizeof(array)); 或者memset(array,0,10*sizeof(int));
撤销:delete [] array;
下面说说二维数组:
二维数组(n行m列)利用new来进行动态分配实际上相当于对n个m元数组进行动态分配,只不过我们不能一味的按照动态分配一维数组的方法来这项操作。MSVC目前还没有这般的人性化,具体应该这样做:
int **array;
array=new int *[10];
for(int i=0;i<10;i++)
array[i]=new int [5];
上面的操作完成了一个10行5列的二维数组array[10][5]的动态分配,可以看到我们先动态分配了一个10单元的数组的指针的指针的首地址给**array,然后再对其每个首地址进行遍历,同时完成一个5单元的数组的动态分分配,并把首地址给*array[i],从而最终完成了二维数组array[10][5]的动态分配。我们可以依此类推得到三维以至多维的数组的动态分配方法。
二维数组的初始化:如果把一维数组初始化办法照搬过来就会发现对于动态分配的二维数组并不适用。从上面介绍可以看出memset只能作用于一个一维数组 *array,因此最好的办法就是和二维数组的动态分配结合起来,new一个,memset一个。具体写法如下:
int **array;
array=new int *[10];
for(int i=0;i<10;i++)
{
array[i]=new int [5];
memset(array[i],0,5*sizeof(int));
}
二维数组的撤销:
for (int i = 0; i < 10; i ++) {
delete[] array[i];
array[i] = NULL;//不要忘记,释放空间后p[i]不会自动指向NULL值,还将守在原处,只是释放内存而已,仅此而已。
}
delete [] array;
array=NULL;
最后说明一个不常用的分配方式:
int (*p)[4] = new int[3][4];
解释:可能有些初学者认为这样是可取的,也是利用 new 分配的数组,就可以是动态的,那你的想法就错了,它的分配必须得有最外层 const 的支持
int x = 3, y = 4;
int (*p)[y] = new int[x][y];//error,y必须是const。
所以这种方式不能达到真正的动态分配二维数组的目的,只能相当于半自动化的一个分配方式。
最后提醒:千万不要有 int *p = new int[4][2]; 这样的错误写法。