Delphi 的类型与指针

 

谈谈 Delphi 的类型与指针[1]

先声明: 不要把我说的这些个东西当作教科书, 这都是自己的浅见; 同时希望得到指正.

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.

知道以上这些就可以操作了, 就可以看懂别人的代码了; 不过要想彻底明白指针到底是怎么回事, 需要从内存谈起.



 

 

 

时间: 2024-10-29 07:01:33

Delphi 的类型与指针的相关文章

结构体 赋值 初始化-结构体类型的指针初始化和赋值问题

问题描述 结构体类型的指针初始化和赋值问题 编程的时候我定义了一个结构体,结构体有几个变量的值我必须要赋初值,因为循环得用.结构体这样定义:typedef struct{ BYTE stream_Type; unsigned short PID; unsigned short InfoDescrip;}M_PICE;用的时候:M_PICE* p_Mpice = NULL;p_Mpice->InfoDescrip = 0;运行到上一句就报错Unhandled exception in DVB.ex

warning C4150: 删除指向不完整“XXX”类型的指针;没有调用析构函数

  情况源于我的之前一片博客<C++ 智能指针>,在我写demo代码的时候.   向前申明了class Phone, 然后再U_ptr类析构函数中delete Phone的指针. 出现warning C4150: 删除指向不完整"XXX"类型的指针:没有调用析构函数     这个waring会导致内存泄露.前向申明的类的析构函数没有被调用     出现warning的代码如下:   #include <iostream> using namespace std;

c语言-C语言函数的形参(结构体类型)和实参类型(指针)可以不同吗?

问题描述 C语言函数的形参(结构体类型)和实参类型(指针)可以不同吗? int numstus; int lens; student pointer; void main() { int i=1; char str[2]; lens=100; pointer=(student *)malloc(lens*LEN); /分配内存*/ numstus=0; welcome(); /*欢迎界面*/ while(i>0) { i=menu_select(); /*控制菜单*/ switch(i) { c

简单总结C语言中各种类型的指针的概念_C 语言

C语言中有很多关于指针的使用,指针也是C语言的灵魂所在,而且C语言中也有很多有关指针的概念,这里学习并总结了一些知道的概念.  常量指针:首先它是一个指针,常量只是用来修饰指针的定语.其定义如下: char const * cp; char a='a'; 如何识别呢?根据右结合优先,先是*优先,所以这个cp变量是一个指针,然后是const修饰*,所以这是一个常量指针.即指向常量的指针. cp=&a; //正常语法 *cp=a; //错误语法,因为其指向的值是一个常量  指针常量:首先它是一个常量

提领指向不完全类型的指针

问题描述 提领指向不完全类型的指针 #include #include #include #include #define ID_MAX 10 #define NAME_MAX 20 #define MOBILE_MAX 15 #define ADDRESS_MAX 100 #define COMP_TEL_MAX 15 #define MAX 100 #define FAILURE 0 #define SUCCESS 1 struct perison { char id[ID_MAX]; ch

Go语言的方法接受者类型用值类型还是指针类型?_Golang

概述 很多人(特别是新手)在写 Go 语言代码时经常会问一个问题,那就是一个方法的接受者类型到底应该是值类型还是指针类型呢,Go 的 wiki 上对这点做了很好的解释,我来翻译一下. 何时使用值类型 1.如果接受者是一个 map,func 或者 chan,使用值类型(因为它们本身就是引用类型). 2.如果接受者是一个 slice,并且方法不执行 reslice 操作,也不重新分配内存给 slice,使用值类型. 3.如果接受者是一个小的数组或者原生的值类型结构体类型(比如 time.Time 类

Delphi记录类型

  学习结构[记录]类型(1) - 开始 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); proc

详解Unified Parallel C中的指针类型,指针算法

UPC 语言中的指针类型 UPC 语言把数据分为共享类型和私有类型.一个指针所指向的数据可能为共享类型或者私有类型,并且指针本身也可以是共享类型或者私有类型.因此 UPC 语言中的指针共有以下四种类型,参见图 1 指向私有数据私有类型指针 指向http://www.aliyun.com/zixun/aggregation/6267.html">共享数据私有类型指针 指向私有数据共享类型指针 指向共享数据共享类型指针 图 1. UPC 语言指针类型 指向私有数据私有类型指针 如图 1 中的

C++:delete不完整类型的指针

简单版 以下代码编译时会有warning: class X; void foo(X* x) { delete x; } 在GCC4.1.2下,编译出错信息是: warning: possible problem detected in invocation of delete operator: warning: 'x' has incomplete type warning: forward declaration of 'struct X' note: neither the destruc