Delphi 動態陣列

2021-05-26 21:30:14 字數 2271 閱讀 6314

1、動態陣列是指標嗎?

動態陣列通常會表現出指標功能,先看下面的例子:

procedure dymarrtest();

vara, b: array of integer;

begin

setlength(a, 3);

a[0] := 0;

b := a;

b[0] := 1;

showmessage(inttostr(a[0]));

end;

在以上程式中,a、b陣列指向的是相同的位址,所以改變了b[0],結果a[0]會等於1。

雖然動態陣列暗含指標功能,但它的記憶體管理卻是生存期管理型別,無需手工釋放。

2、為什麼改變形參卻沒有改變實參的值?

雖然動態陣列會表現出指標的功能,在直接用它宣告形參,改變形參值時,卻是不會改變實參的,看下面的例子:

procedure dymarrparam(arr: array of integer);

vari: integer;

begin

for i := 0 to length(arr) - 1 do

arr[i] := 2;

end;

procedure tform1.button1click(sender: tobject);

vara: array of integer;

i: integer;

begin

setlength(a, 2);

for i := 0 to length(a) do

a[i] := 1;

dymarrparam(a);//試圖把陣列中的元素值改變為2

caption := inttostr(a[0]) + ',' + inttostr(a[1]);

end;

可以看到最終並沒有把實參陣列a元素值變為2。

原因是這種傳遞方法編譯器會在dymarrparam中複製了乙個a的副本,而不是像在第1點中所期望的那樣改變了a的值,可見動態陣列並非就等同指標。

3、如何通過動態陣列的形參改變實參值?

1>var

在delphi中很顯然方法的是,在dymarrparam過程中通過var修飾形參,即

procedure dymarrparam(var arr: array of integer);

在不想通過形參改變實參值時,可以用const修飾形參,明確表示出不可修改意思,即

procedure dymarrparam(const arr: array of integer);

這樣做之後,如果對arr賦值的話,將會編譯不通過。

2>type

另一種就是用type重新定義乙個型別,

例如:type

tdymintarray = array of integer;//在system單元已經宣告了個tboundarray,用它也可以

然後用於形參宣告,如下:

procedure dymarrparam(arr: tdymintarray);

呼叫此函式時用的實參的型別也必須為tdymintarray。

這樣做,不用var修飾形參,也一樣可以通過形參改變實參。在這種情況下,即使用const修飾形參,也一樣可以修改形參的值來改變實參的值。

plus: c99也定義了一種叫vla (varriable length array), gcc3.4以上支援, int a[n]這類寫法;

2.delphi的動態陣列與字串一樣,是生存期自管理型別。

動態陣列第乙個元素前面的2個integer分別是引用計數和陣列當前長度。嗯。跟字串一樣。但是只有動態陣列長度不為0時,這8個位元組才可以訪問,否則access violation。

雖然可以用setlength改變動態陣列的長度,但是不能在函式內部改變其開放陣列引數的長度(別問偶什麼是開放陣列引數)。如果要改變陣列引數的長度,可以把引數型別定義為下面的tdynarray型別的var或out引數,但是這樣定義後,該引數就不叫動態陣列引數了(不能傳遞固定維數的陣列作實參):

tdynarray:array of elemtype; //elemtype為某種具體的資料型別

動態陣列的索引都是從0開始,所以請注意避免索引越界錯誤。還有一點很好玩的是,當動態陣列長度為0時,雖然不可以讀取或設定其第乙個元素的值,但是卻可以獲取該元素位址。比如@dynarr[0]不會產生執行時錯誤,它返回nil,所以應該是編譯器把它等同於陣列名了dynarr吧。

釋放動態陣列的記憶體可以用setlength將其長度設定為0,或者直接賦nil值。當然,如果你不手動釋放,編譯器會為你處理的。但是如果你儲存的是物件或緩衝區的指標,你必須負責釋放他們。

Delphi動態陣列介紹

從 delphi4起,開始了內建各種型別的動態陣列支援。但是,對我們來說動態陣列支援似乎做的不夠徹底,因為delphi竟然連刪除 插入 移動連續元素的函式都沒有提供,讓人使用起來總覺得不夠爽!j。作為一名程式設計師,我們當然要有自己解決問題的能力,下面就讓我們簡單介紹一下delphi 下的動態陣列。...

Delphi7 動態陣列

初學delphi,感覺.這感覺就是寫 太費勁了,已經習慣了c 那種信手拈來,不能說pascal不適應只能說還是費勁,可能是d7太老了,也可能是我還沒有上道兒,就這麼著吧,下面簡單的寫倆函式作為參考,修改修改可以當c 中的list 用arr array of string procedure add ...

Delphi中的動態陣列總結

今天做的乙個專案中要使用一大串資料進行處理。如何對這一系列的資料進行儲存成為乙個首要的問題。唉,delphi啊,你何時才能支援泛型啊。在c c 這都不是問題了啊。在delphi裡只有tstringlist這個容器可以使用,但是它是處理字串的。一進一出,需要大量的typecast時間。用鍊錶?不值得。...