Delphi 陣列和結構體

2021-09-05 22:46:41 字數 1803 閱讀 9966

技術交流,dh講解.

記得很早之前我就說過,陣列和結構體在記憶體中其實一樣的,他們都是連續分布的.

例如:

tmystruct = record

a,b,c:integer;

end;

t3intarray = array[0..2]of integer;

這兩個都佔12位元組,而且tmystruct.a就是t3intarray[0].

而我們知道在訪問陣列中某個元素的時候,只是在第乙個元素的位址 + 序號 * 元素大小.

那麼訪問結構體應該也是這樣的,只是結構體中每個元素的大小不一定都是一樣的,而陣列中每個元素都是一樣的.

好的我們來看段**:

type

tmystruct = record

a,b,c:integer;

end;

t3intarray = array[0..2]of integer;

pmystruct = ^tmystruct;

procedure tform2.button2click(sender: tobject);

var aarray:array[0..99] of byte;

p:pmystruct;

i: integer;

begin

p:=pmystruct(@aarray[0]);

for i := 0 to 5 - 1 do

begin

p^.a:=55;

p^.b:=66;

p^.c:=77;

inc(p);

end;

end;

其實這個p我們相當於定義乙個tmystruct的陣列,有5個元素,但是我們定義的是乙個指標,而且沒有分配空間,我是在aarray的空間上面使用.

也就是過程結束的時候,aarray空間被收回,那麼p也就消失了.看看反彙編**:

utmain.pas.143: p:=pmystruct(@aarray[0]);

004b6acb 8bc4 mov eax,esp

utmain.pas.144: for i := 0 to 5 - 1 do

004b6acd ba05000000 mov edx,$00000005 //迴圈變數

utmain.pas.146: p^.a:=55;

004b6ad2 c70037000000 mov [eax],$00000037 //對a賦值55

utmain.pas.147: p^.b:=66;

004b6ad8 c7400442000000 mov [eax+$04],$00000042 //對b賦值66

utmain.pas.148: p^.c:=77;

004b6adf c740084d000000 mov [eax+$08],$0000004d //對c賦值

utmain.pas.149: inc(p);

004b6ae6 83c00c add eax,$0c //移動指標,乙個tmystruct的大小是3*4=12=$0c

utmain.pas.144: for i := 0 to 5 - 1 do

004b6ae9 4a dec edx

004b6aea 75e6 jnz $004b6ad2

很清楚的看到了,訪問和修改結構體中某個元素的值,也是在結構體指標上面進行偏移.

好的,下一次看看列舉.

放假了.在家公尺有網了.好好學習一下.

結構體指標和結構體陣列

struct ha 100 b,c 3 d 結構體指標其實是乙個指標,它儲存的是指向某個結構體的 位址 所以結構體指標陣列儲存的其實是指向一組結構體的 位址 陣列,它本身並不包含結構體的具體內容 沒有被分配記憶體 所以當用到他們時,要麼重定向,比如 d b 讓d指向b,d儲存的是b的位址,這樣就能通...

DELPHI結構體的定義和使用

窗體設計如上面結構!如下 unit unit1 inte ce uses windows,messages,sysutils,variants,classes,graphics,controls,forms,dialogs,stdctrls type tform1 class tform edit1...

結構體 結構體陣列

void test 函式遞迴呼叫 允許函式體裡再次呼叫函式本身 使用遞迴一定要有出口 long fact int n return n fact n 1 定義乙個新的資料型別 struct mypoint 結構體型別所占用的記憶體空間是最大資料型別的整數倍。因為結構體型別的變數在分配記憶體時有記憶體...