Delphi 的類型與指針

Delphi 的指針分爲 "類型指針" 和 "無類型指針" 兩類.
Delphi 中的類型, 常用的也得有幾百個, 我們可以給每種類型定義相應的類型指針.
其實 Delphi 已經爲很多類型預定義了指針, 譬如數據類型: 
Integer 有對應的 PInteger;
Char 有對應的 PChar;
string 有對應的 PString;
再譬如: 
TPoint 有對應的 PPoint;
TColor 有對應的 PColor 等等.

另外, 指針也可以有指針, 譬如: PChar 是字符指針, PPChar 又是 PChar 的指針(這都是 Delphi 預定義的).

根據上面的例子, 咱們先總結一下類型與指針的命名規則:
類型約定用 T 打頭(Delphi 常規的數據類型除外, 譬如: String);
指針約定用 P 打頭;
指針的指針約定用 PP 打頭.
類型和指針是不可分的兩個概念, 指針本身也是一種類型 - "指針類型".


先認識一下指針相關的操作符(@、^、Addr):

@ @變量 獲取變量指針
Addr Addr(變量)
^ 指針^ 獲取指針指向的實際數據
var Pxxx: ^類型 定義 Pxxx 某種類型的指針的變量 
type Pxxx = ^類型  定義 Pxxx 爲某種類型的指

舉例說明:


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//Integer 與 PInteger
procedure TForm1.Button1Click(Sender: TObject);
var
  int: Integer;
  pint: PInteger; {定義類型指針, Integer 類型的指針}
begin
  int := 100;
  pint := @int;        {現在 pint 就是 int 的指針}
  pint^ := pint^ + 1;  {現在 pint^ 和 int 是一回事, 測試一下:}
  ShowMessage(IntToStr(int));   {101}
  ShowMessage(IntToStr(pint^)); {101}
end;

//直接定義類型指針
procedure TForm1.Button2Click(Sender: TObject);
var
  int: Integer;
  PMyInt: ^Integer;
begin
  int := 100;
  PMyInt := Addr(int); {這句和: PMyInt := @int; 相同}
  PMyInt^ := PMyInt^ + 1;
  ShowMessage(IntToStr(int));     {101}
  ShowMessage(IntToStr(PMyInt^)); {101}
end;

//先自定義指針類型
procedure TForm1.Button3Click(Sender: TObject);
type
  PInt = ^Integer;
var
  int: Integer;
  PMyInt: PInt;
begin
  int := 100;
  PMyInt := @int;
  PMyInt^ := PMyInt^ + 1;
  ShowMessage(IntToStr(int));     {101}
  ShowMessage(IntToStr(PMyInt^)); {101}
end;

//指針的指針
procedure TForm1.Button4Click(Sender: TObject);
var
  int: Integer;
  pint: PInteger;
  ppint: ^PInteger;
begin
  int := 100;
  pint := @int;
  ppint := @pint;
  ppint^^ := ppint^^ + 1;
  ShowMessage(IntToStr(int));     {101}
  ShowMessage(IntToStr(pint^));   {101}
  ShowMessage(IntToStr(ppint^^)); {101}
end;
end.

 

知道以上這些就可以操作了, 就可以看懂別人的代碼了; 不過要想徹底明白指針到底是怎麼回事, 需要從內存談起.

發佈了47 篇原創文章 · 獲贊 60 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章