C++——C++创建动态二维数组+memset()函数初始化

C++开辟动态二维数组的几种方法总结

原文链接: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<vector<int> > a;
a.resize(row, vector<int>(column));

方法二:
vector<vector<int> > a(row, vector<int>(column)); //默认用0初始化
//vector<vector<int> > a(row, vector<int>(column,-1));//用-1初始化二维数组
注:如果row > a.size(),则在a.end()之前插入vector<int>(column)的row次拷贝,相当于row行column列

方法三:
vector<vector<int> > 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<iostream>
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<n;i++)
    swp[i]=new int[m];
    return 0;
}

2、用变量定义二维数组的长度

    int lineCnt=100;
    int **dian_point=(int **)malloc(sizeof(int) * (lineCnt+1));//用变量lineCnt定义scan数组的行数 针对二维数组
//    int f=4;//定义scan数组的列数
    for(int i=0;i<lineCnt+1;i++)
        dian_point[i]=new int[4]; //每一行中申请4个int空间  (lineCnt+1)行  f列


3、使用vector创建一个二维数组

    int n=10,m=2;     //
    vector<vector<int> > swp(n);//表示二维数组有  4行  后面两个> >中间的空格不能省略
    for(int i=0;i<n;i++)
    {swp[i].resize(m);}//表示二维数组有   2列


方法3中,,上面多写了三行,就是为了指定 数组swp的列数。 今天才发现,可以用更简单的方法完成上面的工作 ,

                    下面的一行就可以代替上面的四行 

    vector<vector<int> >swp(n,vector<int>(m));//定义二维数组swp[][],n行 m列


 

C++二维动态数组memset()函数初始化

本文链接: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]; 这样的错误写法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值