文档章节

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

涂孟超
 涂孟超
发布于 2014/09/26 15:37
字数 634
阅读 1
收藏 0
点赞 0
评论 0
先声明: 不要把我说的这些个东西当作教科书, 这都是自己的浅见; 同时希望得到指正.

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.

 
 
 
 
 

 

 

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

本文转载自:http://www.cnblogs.com/del/archive/2008/03/07/1094655.html

共有 人打赏支持
涂孟超
粉丝 12
博文 2004
码字总数 14107
作品 0
深圳
程序员
用好Delphi中的字符串

用好Delphi中的字符串日期:2005年10月18日 作者: 人气:17184 查看:[大字体 中字体 小字体]一:各种字符串  字符串是Object Pascal所有数据类型中最有用的类型。许多函数以字符串为传递参...

vga ⋅ 2016/08/09 ⋅ 0

delphi调用c动态库实践

一、概述 Delphi是Borland公司研制的高效的可视化开发工具,它既可用于开发系统软件,也适合于应用软件的开发。随着韩国网络游戏《传奇》的红火,其开发工具delphi也被更多的软件开发人员所熟...

KavenSu ⋅ 2014/01/13 ⋅ 0

Delphi函数指针的使用

delphi中可以通过函数指针把一个函数作为参数来传递,然后在另外一个函数中调用。 1) 首先,申明函数指针类型TFunctionParameter。 type TFunctionParameter = function(const value : integ...

geek_loser ⋅ 2014/09/01 ⋅ 0

delphi pchar char byte string转换问题

delphi pchar char byte string转换问题 注:Delphi中的Char,PChar,PByte,Byte,String的相互转换,您是不是也遇到过,为此头疼过吗?你要是明白了他们的原理就会轻松了。 话题064840的标题是...

鹅倌 ⋅ 2017/01/06 ⋅ 0

C语言指针专题——如何理解指针

欢迎关注我的微博与微信号:C语言编程技术分享 本文为原创,欢迎转发! 推荐书籍: 1. 2017年9月全国计算机二级c语言程序设计上机考试新版题库全真模拟试卷全套,购买地址:¥NDby0brslIm¥ ...

石家的鱼 ⋅ 2017/03/28 ⋅ 0

Delphi的一些重要语法

本文转自 xkdcc 51CTO博客,原文链接:http://blog.51cto.com/brantc/116479,如需转载请自行联系原作者 一. 流程控制语句 1.1 Case Statements 二. 类型 2.1 过程类型 用法3的类型表示方法指...

像教授 ⋅ 2017/11/26 ⋅ 0

最基础的数据结构-左轻侯

作者:左轻侯 创建时间:2007-03-04 22:29:06 最后修改时间:2008-01-18 22:07:52 本文发表于《程序员》2007年第3期      最基础的数据结构   左轻侯   2007.2.3      引言   ...

一配 ⋅ 2015/10/16 ⋅ 0

Delphi、PChar和Char数组的比较

Delphi、PChar和Char数组的比较   string和Char数组都是一块内存, 其中存放连续的字符. string保存具体字符的内存对用户是透明的, 由Delphi管理它的分配, 复制和释放, 用户不能干预(其实也...

技术小甜 ⋅ 2017/11/08 ⋅ 0

delphi之多线程编程(一)

delphi之多线程编程(一) 本文的内容取自网络,并重新加以整理,在此留存仅仅是方便自己学习和查阅。所有代码均亲自测试 delphi7下测试有效。图片均为自己制作。 多线程应该是编程工作者的基础...

KavenSu ⋅ 2014/01/22 ⋅ 0

C++如何设计一个含指针的类(Boolan笔记第二周)

C++里面设计一个含指针的类比设计一个不含指针的类要复杂很多,因为需要考虑Big Three,也就是三个特殊函数: 拷贝构造函数(copy constructor), 拷贝赋值函数(copy assignment operator) 析...

roufoo ⋅ 2017/02/07 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JavaScript零基础入门——(十)JavaScript的DOM基础

JavaScript零基础入门——(十)JavaScript的DOM基础 欢迎大家回到我们的JavaScript零基础入门,上一节课,我们了解了JavaScript中的函数,这一节课,我们来了解一下JavaScript的DOM。 第一节...

JandenMa ⋅ 55分钟前 ⋅ 0

Spring mvc DispatchServlet 实现原理

在Spring中, ContextLoaderListener只是辅助类,在web 容器启动的时候查找并创建WebApplicationContext对象,通过该对象进行加载spring的配置文件。而真正的逻辑实现其实是在DispatcherSer...

轨迹_ ⋅ 今天 ⋅ 0

Weex起步

本教程假设你已经在你的本地环境安装了node 其实weex起步教程在 https://github.com/lilugirl/incubator-weex 项目说明文件中都已经有了,但为了有些同学看到英文秒变文盲,所以这里我重新写...

lilugirl ⋅ 今天 ⋅ 0

Jenkins实践1 之安装

1 下载 http://mirrors.jenkins.io/war/latest/jenkins.war 2 启动 java -jar jenkins.war 前提:安装jdk并配置环境变量 启动结果节选: ************************************************......

晨猫 ⋅ 今天 ⋅ 0

组合数学 1-2000 中,能被6或10整除的数的个数

1--2000 中,能被6或10整除的数的个数 利用集合的性质 能被6整除的个数 2000/6 = 333 能被10整除的个数 2000/10 = 200 能被6和10整除的个数 2000/30 = 66 能被6或10整除的个数 333+200-66 =...

阿豪boy ⋅ 今天 ⋅ 0

一篇文章学懂Shell脚本

Shell脚本,就是利用Shell的命令解释的功能,对一个纯文本的文件进行解析,然后执行这些功能,也可以说Shell脚本就是一系列命令的集合。 Shell可以直接使用在win/Unix/Linux上面,并且可以调用...

Jake_xun ⋅ 今天 ⋅ 0

大数据工程师需要精通算法吗,要达到一个什么程度呢?

机器学习是人工智能的一个重要分支,而机器学习下最重要的就是算法,本文讲述归纳了入门级的几个机器学习算法,加大数据学习群:716581014一起加入AI技术大本营。 1、监督学习算法 这个算法由...

董黎明 ⋅ 今天 ⋅ 0

Kylin 对维度表的的要求

1.要具有数据一致性,主键值必须是唯一的;Kylin 会进行检查,如果有两行的主键值相同则会报错。 2.维度表越小越好,因为 Kylin 会将维度表加载到内存中供查询;过大的表不适合作为维度表,默...

无精疯 ⋅ 今天 ⋅ 0

58到家数据库30条军规解读

军规适用场景:并发量大、数据量大的互联网业务 军规:介绍内容 解读:讲解原因,解读比军规更重要 一、基础规范 (1)必须使用InnoDB存储引擎 解读:支持事务、行级锁、并发性能更好、CPU及...

kim_o ⋅ 今天 ⋅ 0

代码注释中顺序更改 文件读写换行

`package ssh; import com.xxx.common.log.LogFactory; import com.xxx.common.log.LoggerUtil; import org.apache.commons.lang3.StringUtils; import java.io.*; public class DirErgodic ......

林伟琨 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部