C++ Code:動態分配陣列記憶體的六種方法
阿新 • • 發佈:2019-02-01
問題:
如何快速給陣列分配自定義長度的記憶體,方法有哪些?
本部落格提供六種方法介紹,包含各種常用用法,且程式碼片親自 編寫-註解-編譯-通過,對讀者負責。
闡述:
提到動態分配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”動態分配一維陣列:
4、利用“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; }
#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;
}
總結:
以上方法有簡單的,也有非常複雜而且古老的,用哪個、按照那種思路去做?主要看程式碼的用處和時間的複雜度要求;
希望大家及時提出交流意見~
希望有更多的知識點給大家分享~