1. 程式人生 > >C++ Code:動態分配陣列記憶體的六種方法

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”動態分配二維陣列:

#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; 
} 


總結:

以上方法有簡單的,也有非常複雜而且古老的,用哪個、按照那種思路去做?主要看程式碼的用處和時間的複雜度要求;

希望大家及時提出交流意見~

希望有更多的知識點給大家分享~