動態數組

聲明時沒有確定數組大小的數組

動態數組是指在聲明時沒有確定數組大小的數組,即忽略圓括弧中的下標;當要用它時,可隨時用ReDim語句重新指出數組的大小。使用動態數組的優點是可以根據用戶需要,有效利用存儲空間。

特點


數組到底應該有多大才合適,有時可能不得而知。所以希望能夠在運行時具有改變數組大小的能力。
動態數組就可以在任何時候改變大小。在Visual Basic中,動態數組最靈活、最方便,有助於有效管理內存。例如,可短時間使用一個大數組,然後,在不使用這個數組時,將內存空間釋放給系統。
如果不用動態數組,就要聲明一個數組,它的大小儘可能達到最大,然後再抹去那些不必要的元素。但是,如果過度使用這種方法,會導致內存的操作環境變慢。

基本步驟


要創建動態數組,請按照以下步驟執行:
(如果希望數組為公用數組,則)用 Public 語句聲明數組,或者,(如果希望數組為模塊級,則)在模塊級用 Dim 語句聲明數組,或者(如果希望數組為局部數組,則)在過程中用 Static 或 Dim 語句聲明數組。給數組附以一個空維數表,這樣就將數組聲明為動態數組。
Dim DynArray ()
用 ReDim 語句分配實際的元素個數。
ReDim DynArray (X + 1)
ReDim語句只能出現在過程中。與 Dim 語句、Static 語句不同,ReDim 語句是一個可執行語句,由於這一語句,應用程序在運行時執行一個操作。
ReDim 語句支持這樣的語法,它與固定數組中使用的語法相同。對於每一維數,每個 ReDim 語句都能改變元素數目以及上下界。但是,數組的維數不能改變。
ReDim DynArray (4 to 12)
例如,用第一次聲明在模塊級所建立的動態數組Matrix1:
Dim Matrix1 () As Integer
然後,在過程中給數組分配空間:
Sub CalcValuesNow ()
.
.
.
ReDim Matrix1 (19, 29)
End Sub
這裡的 ReDim 語句給 Matrix 分配一個 20 × 30 的整數矩陣(元素總大小為 600)。還有一個辦法,用變數設置動態數組的邊界:
ReDim Matrix1 (X, Y)
注意 您可以將字元串賦值給大小可變的位元組數組。一個位元組數組也可以被賦值給一個可變長的字元串。一定要注意字元串中的位元組數會隨平台而變化。同一個字元串在 Unicode 平台上的位元組數是它在非 Unicode 平台上的兩倍。

相關內容

每次執行 ReDim 語句時,當前存儲在數組中的值都會全部丟失。Visual Basi 重新將數組元素的值置為 Empty(對 Variant 數組)、置為 0(對 Numeric 數組)、置為 零長度字元串(對 String 數組)或者置為 Nothing(對於對象的數組)。
在為新數據準備數組,或者要縮減數組大小以節省內存時,這樣做是非常有用的。有時希望改變數組大小又不丟失數組中的數據。使用具有 Preserve 關鍵字的 ReDim 語句就可做到這點。例如,使用 UBound 函數引用上界,使數組擴大、增加一個元素,而現有元素的值並未丟失:
ReDim Preserve DynArray (UBound (DynArray) + 1)
在用 Preserve 關鍵字時,只能改變多維數組中最後一維的上界;如果改變了其它維或最後一維的下界,那麼運行時就會出錯。所以可這樣編程:
ReDim Preserve Matrix (10, UBound (Matrix, 2) + 1)
而不可這樣編程:
ReDim Preserve Matrix (UBound (Matrix, 1) + 1, 10)
詳細信息 關於動態數組的更詳細信息,請參閱語言參考中的“ReDim 函數”。關於對象數組,請參閱“用對象編程”。

數組運用

以上是Basic動態數組的建立方法。在C++語言中,二維動態數組主要使用指針的方法建立,以建立一個整數二維數組為例:
int main()
{
int column,row;
cout<<"輸入二維數組的行數和列數"<
cin>>row>>column;
int **array;
array = (int **) malloc(sizeof(int *)*row);
for(int i=0 ; i !=row ; i++)
array[i]=(int *) malloc(sizeof(int )*column);
cout<<"輸入二維數組"<
for(int j=0 ; j !=row ; j++)
{
for(int k=0 ; k !=column ; k++)
{
cin>>array[j][k];
}
}
cout<<"輸入的二維數組為"<
for( int j=0 ; j !=row ; j++ )
{
for(int k=0 ; k !=column ; k++)
{
cout<
}
cout<
}
//釋放空間
for(int i=0 ; i !=row ; i++)
free(array[i]);
free(array);
return 0;
}
  • 目錄