C++ Code:动态分配数组内存的六种方法

问题:

        如何快速给数组分配自定义长度的内存,方法有哪些?

        本博客提供六种方法介绍,包含各种常用用法,且代码片亲自 编写-注解-编译-通过,对读者负责。

阐述:

        提到动态分配C++的数组,我们想到的标签会有:malloc-free、new-delete、一维、二维...等等,本博客初创初心是各大公司企业都会青睐于在笔试或者面试中,要求应届生具备手写分配内存、或者排序之类的代码的能力,所以提供六种用法。

正文:


1、利用“malloc-free”动态分配一维数组:

#include <iostream>
#include<stdlib.h> //该头文件为malloc必须 
using namespace std;

int main()
{
	int len;
	int *p; 
	cout<<"请输入开辟动态数组的长度:"<<endl;
	cin>>len;
	//长度乘以int的正常大小,才是动态开辟的大小 
	p = (int*)malloc(len*sizeof(int));
	cout<<"请逐个输入动态数组成员:"<<endl;
	for(int i=0; i<len; ++i)
	{
		//此处不可以写成:cin>>*p[i] 
		cin>>p[i];
	}
	cout<<"您输入的动态数组为:"<<endl;
        for(int i=0; i<len; ++i)
	{
		cout<<p[i]<<" ";
	}
	//时刻记住:有malloc就要有free 
	free(p);
 } 

2、利用“malloc-free”动态分配二维数组:


扫描二维码关注公众号,回复: 3799107 查看本文章

#include <iostream>  
#include<stdlib.h> //该头文件为malloc必须   
using namespace std;  
  
int main()  
{  
    int row,col;  
    int **p;   
    cout<<"请输入开辟动态数组的行 & 列:"<<endl;  
    cin>>row>>col; 
    //开始开辟  
	p = (int**)malloc(row*sizeof(int*));//为数组的行开辟空间   
	for(int i=0; i<row; ++i)  
	{  
	    *(p+i)=(int*)malloc(col*sizeof(int));//为数组的列开辟空间   
	}  
	  
	//输入成员   
	cout<<"请逐个输入动态数组 各行各列 成员:"<<endl;  
	for(int i=0; i<row; ++i)  
	    for(int j=0; j<col; ++j)  
	    {  
	        //此处不可以写成:cin>>*p[i] [j]  
	        cin>>p[i][j];  
	    }  
	      
	//输出成员   
	cout<<"您输入的动态数组 各行各列 成员如下:"<<endl;  
	for(int i=0; i<row; ++i)  
	    for(int j=0; j<col; ++j)  
	    {  
	        cout<<p[i][j];  
	    }  
	      
	      
	//时刻记住:有malloc就要有free   
	for(int i=0; i<row; ++i)  
	{  
	    free(*(p+i));  
	 }   
	  
	} 



3、利用“new-delete”动态分配一维数组:


#include <iostream>
using namespace std;

int main()
{
	int len;
	cout<<"请输入开辟数组的长度:"<<endl;
	cin>>len; 
	int *p = new int [len];
	
	//数据输入 
	cout<<"请逐个输入数据:"<<endl;
	for(int i=0; i<len; ++i)
	{
		cin>>p[i];
	 } 
	 
	//数据反馈 
	cout<<"您分配的动态数组为:"<<endl;
	for(int i=0; i<len; ++i)
	{
		cout<<p[i]<<" ";
	 } 
	 
	//释放内存:
	delete []p; 
 } 


4、利用“new-delete”动态分配二维数组:


#include <iostream>
using namespace std;

int main()
{
	int row,col;
	cout<<"请输入开辟数组的行 & 列:"<<endl;
	cin>>row>>col; 
	//行的开辟 
	int **p = new int*[row];
	for(int i=0; i<row; ++i)
	{
		//列的开辟 
		p[i] = new int[col];
	}
	
	//数据输入 
	cout<<"请逐个输入 各行各列 数据:"<<endl;
	for(int i=0; i<row; ++i)
    	for(int j=0; j<col; ++j) 
		{
			cin>>p[i][j];
	 	} 
	 
	//数据反馈 
	cout<<"您分配的动态数组为:"<<endl;
	for(int i=0; i<row; ++i)
    	for(int j=0; j<col; ++j) 
		{
			cout<<p[i][j]<<"";
	 	} 
	 
	//释放内存:

	delete []p; 
 } 


5、利用“new-delete”动态分配二维数组:


#include <iostream>
#include<vector>
using namespace std;

int main()
{
	int row,col;
	cout<<"请输入行 & 列:"<<endl;
	cin>>row>>col;
	//很复杂的结构:对于某些编译器,注意连空格都不可以忽略 
	vector<vector<int> > p(row,vector<int>(col));
	
	//数据输入 
	cout<<"请逐一输入 各行各列 数据:"<<endl;
	for(int i=0; i<row; ++i)
		for(int j=0; j<col; j++)
		{
			cin>>p[i][j];
		}
	
	//数据输出 
	cout<<"您输入的数据:"<<endl;
	for(int i=0; i<row; ++i)
		for(int j=0; j<col; j++)
		{
			cout<<p[i][j]<<" ";
		}
		
	//该方法利用的是两重的vector而无需释放 
}

6、利用while的极其简单输入实现求和、求平均之类算法:


#include <iostream>
using namespace std;


int main()
{
	int sum=0,value=0;
	//实际上非数字就会结束循环 
	cout<<"请输入求和数字,以*号作为结束;"
	while(cin>>value)
	    sum += value;
	cout<<"您输入数据之和为:"<<sum<<endl; 
} 


总结:

以上方法有简单的,也有非常复杂而且古老的,用哪个、按照那种思路去做?主要看代码的用处和时间的复杂度要求;

希望大家及时提出交流意见~

希望有更多的知识点给大家分享~

猜你喜欢

转载自blog.csdn.net/Errors_In_Life/article/details/78889951