程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi 的內存操作函數(3): 給結構體指針分配內存

Delphi 的內存操作函數(3): 給結構體指針分配內存

編輯:Delphi

使用結構或結構數組, 一般是不需要主動分配內存的, 譬如:var
 pts: TPoint;
begin
 pts.X := 1;
 pts.Y := 2;
 ShowMessageFmt('%d,%d', [pts.X, pts.Y]); {1,2}
end;
//結構數組:
var
 Arr: array[0..2] of TPoint;
 i: Integer;
begin
 for i := 0 to Length(Arr) - 1 do
 begin
  Arr[i].X := i;
  Arr[i].Y := Trunc(Sqr(i));
 end;
 ShowMessageFmt('%d,%d', [Arr[High(Arr)].X, Arr[High(Arr)].Y]); {2,4}
end;

  但在很多時候, 一些參數是結構指針; 特別是在接受數據時, 一般需要手動分配內存. 如果只使用一個單結構指針, 用 New 分配內存是最合適的, 譬如:var
 p: PPoint; {這是點結構 TPoint 的指針, 系統早定義好的}
begin
 New(p);
// p^.X := 1; p^.Y := 2; {或者寫成下面這樣}
 p.X := 1; p.Y := 2;
 ShowMessageFmt('%d,%d', [p.X, p.Y]);
 Dispose(p);
end;

  更多時候, 我們需要給一個結構指針分配更多容量; GetMem 可以很容易地完成這個任務, 關鍵是如何訪問. 譬如:var
 p: PPoint;
begin
 p := GetMemory(4 * SizeOf(TPoint)); {分配能容納 4 個 TPoint 結構的內存}
 {下面的代碼訪問了第一個結構, 其他 3 個怎麼訪問呢?}
 p.X := 1; p.Y := 11;
 ShowMessageFmt('%d,%d', [p.X, p.Y]); {1,11}
 FreeMemory(p);
end;
//訪問給結構指針分配的其他元素:
var
 p: PPoint;
 buf: array[0..255] of Char;
begin
 p := GetMemory(4 * SizeOf(TPoint)); {分配能容納 4 個 TPoint 結構的內存}
 p.X := 1; p.Y := 11;
 Inc(p); {指向第二個結構}
 p.X := 2; p.Y := 22;
 Inc(p); {指向第三個結構}
 p.X := 3; p.Y := 33;
 Inc(p); {指向第四個結構}
 p.X := 4; p.Y := 44;
 {既然用了 Inc, 那麼在釋放或使用前, 必須把指針退回到起始點!}
 Dec(p, 3);
 {讀出看看; 注意這裡的 wvsprintf 也是格式化函數, 有時它更方便}
 wvsprintf(buf, '%d,%d; %d,%d; %d,%d; %d,%d', PChar(p));
 ShowMessage(buf); {1,11; 2,22; 3,33; 4,44}
 FreeMemory(p);
end;

  如上的操作簡直太殘忍了, 幸虧數據少; 其實這種情況應該用數組, 這裡提供一種更巧妙的辦法 - 轉換(為數組類型):var
 p: PPoint;
 i: Integer;
 buf: array[0..255] of Char;
type
 ArrPoint = array of TPoint; {用於轉換的自定義類型}
begin
 p := GetMemory(4 * SizeOf(TPoint));
 for i := 0 to 3 do
 begin
  ArrPoint(p)[i].X := i;
  ArrPoint(p)[i].Y := i * i;
 end;
 wvsprintf(buf, '%d,%d; %d,%d; %d,%d; %d,%d', PChar(p));
 ShowMessage(buf); {0,0; 1,1; 2,4; 3,9}
 FreeMemory(p);
end;


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved