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