動態記憶體配置(Dynamical Memory Allocation)
寫一個計算10筆資料的平均值的程式,會宣告大小為10的陣列:
float data[10];
如果下一次要計算的資料是26筆或100筆,就需要修改程式,將陣列大小改為26或100,再重新編譯、執行,毫無彈性可言。
比較彈性的處理方法是:程式撰寫的時候不設定陣列的大小,執行時才讓使用者輸入動態的方式指定、配置和使用陣列所需的記憶體。
動態記憶體配置會宣告一個指標變數,再藉由C++所提供的動態記憶體配置運算子new來執行動態記憶體配置,
指標變數 = new 指標的變數型別[記憶體大小];
例如:
int *m; //宣告一個指標變數m
m = new int[1000]; //配置1000個整數的記憶空間給指標變數m,m即為一個陣列
一旦不再需要這個動態配置的陣列,我們還可以把記憶體釋放出來,以便讓程式有更大的記憶空間做其他用途。釋放記憶體的方法是使用C++所提供的釋放記憶體運算子,語法很簡單:
delete 指標變數;
例如:
delete m;
delete會把前面m所配置的記憶體釋放出來。m又回復成為原先的指標變數,因此還可以再度配置不同的記憶空間給m,以便因應不同陣列大小的需求。在程式執行過程中,一個指標可以被反覆的配置、釋放動態記憶體任意次。
----------------------------------------------------------------
#include <iostream>
int main(){
int *p; //宣告一個整數的指標p
p = new int[3]; // 配置記憶體給p,使p成為一個整數陣列
if(p==0) //配置記憶體失敗
{
return;
}
p[0] = 20;
p[1] = 30;
p[2] = 40;
int i;
for(i=0;i<3;i++)cout << p[i]<<endl;
delete p; // 釋放記憶體
}
----------------------------------------------------------------
#include <iostream>
int main(){
int *m; //宣告一個整數的指標m
int i,j,num;
for(i=0;i<25;i++)
{
num=random(80); //亂數產生陣列大小num
m = new int[num]; // 配置記憶體給m
for(j=0;j<num;j++)
{
m[j]=random(10); //將陣列m任意填入[0,9]的亂數
cout<<m[j]; //輸出
}
cout<<endl; //換行
}
}
----------------------------------------------------------------
寫一個程式,讓使用者輸入一個整數N後,動態配置大小為N的整數陣列data,再由使用者輸入N個陣列值,求其平均值輸出。
提示:
cin>>N;
int *data;
data=new int[N];
cout<<"Enter "<<N<<" values : ";
for(i=0;i<N;i++)
{
cin>>data[i];
}