技術交流,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 結構體型別所占用的記憶體空間是最大資料型別的整數倍。因為結構體型別的變數在分配記憶體時有記憶體...