Delphi指针及其它(转)
一、指针:指向一个内存地址的变量或参数。
二、定义指针的方式如下:
P: Pointer; //定义了可以指向任何类型的指针,Pointer 为无类型指针;
Q, R: ^TType; //定义了指向 TType 类型的两个指针,TType 可是是各种
//基本类型或自己定义的各种类型,也可以如下定义:
// type PType = ^TType;
// var Q, R: PType;
三、指针的使用:
P: Pointer;
Q, R: ^TType;
A: TType;
Q:= R; //相同类型可以赋值
P:= R; //可以把任何类型指针赋给无类型指针
R:= P; //可以把无类型指针赋给有类型的指针
Q:= @A; //加 @ 后,得到指向 A 的无类型指针,然后赋给 Q
New(Q); //分配一个 TType 类型的空间,并把地址赋给 Q
Dispose(Q); //释放 Q 所指向的空间
四、指针的强制转换
type TType = record ... end;
PType = ^record ... end;
var P: ^Integer;
A: TType;
P:= @A; //加 @ 后,得到指向 A 的无类型指针,可以赋给 P
PType(P).xxx //把 P 转换为 PType 类型,并引用记录中的值
with PType(P)^ do begin ... end; // 注意 ^ 的使用,在上一行中,
//不需要加 ^ (当然加也不错),编译器可以自动识别,
//而在这一行中,如不加 ^ ,会引起混淆。
例子(把 string 的一个汉字当作 WideChar 并赋给一个整型变量):
A: Integer; S: string;
A:= Word(PWideChar(@S[3])^);
// @S[3] 得到 S[3] 的地址,然后把它当作指向 WideChar 的指针,
// 用 ^ 取出一个汉字,再用 Word 强制转换,最后赋给一个整型变量。
// 用 Word 转换的原因是 Word 的字节数和 WideChar 的字节数一样。
// 在 Delphi 中,只要字节数一样的类型,都可以用强制转换,如字节
// 不一样,就要用函数,这也是很合情理的。
// 一定要这么写是让程序员知道自己在干什么,不至于出错,真正的实现
// 是很简单的。
五、函数类型
函数类型也是指针,定义函数类型如下:
type TFunc = function (X: Integer; S: string): Boolean;
TProc = procedure;
var F, G: function(A: Integer): string;
function Test(B: Integer): string;
使用:
F:= nil; //函数类型是指针
F:= Test; //当函数类型在赋值号左面,右面是一个函数时当作是对函数
//类型赋值,其它情况(如右面不是一个函数或函数类型在左
//面或不是赋值号等),则认为是调用指向的函数,如下面一行
S:= F(3); // 直接调用函数 Test(3);
F:= @Test; // 取 Test 函数的地址并赋给 F,所以这样也正确
@F:= @Test; //对函数类型取地址,得到的是所指向函数的地址,所以这样也正确
@@F ... // 若想取函数类型的地址用两个 @,即 @@
@F = @Test; // 判断 F 是否指向 Test,通过比较两个无类型指针得到
Assigned(F) // 因为 F = nil 中左侧是调用 F,为了判断 F 是否不为空,
// 用 Assigned
六、方法指针
这里指的是类内的函数类型,是一对指针,一个指向函数地址,另一个存放
实例的引用。
定义如下:
TMethod = procedure (...) of object;
使用:
type TTest = class procedure T(...); end;
var M: TMethod;
M:= TTest.T;
因为这里是一对指针,与其他指针的转换就有些问题,这里就不说了。
七、集合、数组、动态数组、记录等
这些是特定的类型,Delphi 没有说他们是指针类型,这和 C 是有区别的
(随便什么都可以当指针用)。这一点请特别注意。
要想使他们和指针取得联系,一般要使用地址符 @,其实这也是很方便的,
如上面的汉字例子。还有前面讨论的 BlockRead 等例子都是这样。
S: array of record ... end;
SetLength(S, N);
BlockRead(F, S[0], N);
~~~ 这里没有 @ 符的原因是它是 var 参数,不加 @ 就会把
S[0] 的地址传进去。
Delphi指针及其它(转)的更多相关文章
- delphi.指针.PChar
此文是delphi.指针.应用姊妹篇,想细化一下PChar应用,所以有了此文. 注意: 1:此文讲的是PChar与字符串相关操作,其它方法暂不多讲. 2:由于D分开Ansi/Unicode的两种完全不 ...
- Delphi指针的用法
DELPHI指针的使用 大家都认为,C语言之所以强大,以及其自由性,很大部分体现在其灵活的指针运用上.因此,说指针是C语言的灵魂,一点都不为过.同时,这种说法也让很多人产生误解,似乎只有C语言的指针才 ...
- Delphi 指针大全(光看不练是学不会的)
大家都认为,C语言之所以强大,以及其自由性,很大部分体现在其灵活的指针运用上.因此,说指针是C语言的灵魂,一点都不为过.同时,这种说法也让很多人产生误解,似乎只有C语言的指针才能算指针.Basic不支 ...
- delphi指针简单入门
delphi指针简单入门: 看一个指针用法的例子: 1 var 2 X, Y: Integer; // ...
- delphi 指针 认识
delphi 指针分为类型指针和无类型指针: 类型指针分为PChar.PInteger.PString等. 无类型指针Pointer. PPChar/PP...为指针的指针 @和Addr一样,为获取变 ...
- Delphi指针详解
Delphi指针详解2007-12-04 06:08:57| 分类: DLL学习 阅读91 评论0 字号:大中小 订阅 大家都认为,C语言之所以强大,以及其自由性,很大部分体现在其灵活的指针运用 ...
- DELPHI指针的使用
DELPHI指针的使用 大家都认为,C语言之所以强大,以及其自由性,很大部分体现在其灵活的指针运用上.因此,说指针是C语言的灵魂,一点都不为过.同时,这种说法也让很多人产生误解,似乎只有C语言的指针才 ...
- delphi.指针.应用
注:初稿...有点乱,可能增删改... 因为指针应用,感觉不好写,请大家指出错误,谢谢. 注意: 本文着重点讲的是指针的各类型的应用或使用,而不是说这种方法不应该+不安全+危险+不提倡使用. 其它:本 ...
- delphi.指针.应用----应用重要 多看 多练
来自:http://www.cnblogs.com/qiusl/p/4026459.html ----------------------------------------------------- ...
随机推荐
- Sonar+Hudson+Maven构建系列之三:安装Hudson
摘要:其实前面介绍过Sonar,后面Hudson安装就方便了.安装Hudson之前说说Hudson相关的事,现在世面上的有两种与Hudson相关的CI工具,一个是Hudson,一个是Jenkins,这 ...
- 错误解决error while loading shared libraries: libXXX.so.X: cannot open shared object file: No such file
转自:http://blog.csdn.net/david_xtd/article/details/7625626 前提:ubuntu-debug机器上向SVN提交了pdu-IVT,想在别的普通机器上 ...
- 2016"百度之星" - 初赛(Astar Round2A)1002 / HDU 5691 状态压缩DP
Sitting in Line Problem Description 度度熊是他同时代中最伟大的数学家,一切数字都要听命于他.现在,又到了度度熊和他的数字仆人们玩排排坐游戏的时候了.游戏的规则十 ...
- 电赛初探(二)——语音采集回放系统
一.系统结构 1.基本要求 (1)话音/功率放大器增益均可调: (2)带通滤波器:通带为300Hz-3.4kHz : (3)ADC:采样频率f s=8kHz,字长不小于8位: (4)语音存储时间≥10 ...
- 我与C++的不解情缘
我是一个老实人,我当时报考C++真的全心是为了自己自考的免考,绝不是为了什么二级证,可是,进行到一半的时候,突然获悉,C++自我们这次开始,不作为免考科目了,当时我的心里啊,那个纠结,那个痛啊,随后, ...
- Web开发中运行环境的配置:(Tomcat7.0.59)和开发环境的配置
第一部分:运行环境的配置 1.下载压缩包,解压即可 2.配置系统变量JAVA_HOME为jdk的安装路径 3.如有需要修改端口号,比如8080已被占用的时候,可以将其改为9080等 apache-to ...
- XMLSAX解析
* HTML不区分大小写,XML区分大小写 * 用浏览器打开xml文件,判断xml文件是否有错 * xml与html的区别 1:xml的标记可以自定义,但是html标记不可以定义.<studen ...
- python 类的初始化
虽然我们可以自由地给一个实例绑定各种属性,但是,现实世界中,一种类型的实例应该拥有相同名字的属性.例如,Person类应该在创建的时候就拥有 name.gender 和 birth 属性,怎么办? 在 ...
- nodeAPI--FS
fs是唯一一个同时提供同步和异步API的模块: 读取文件夹文件名,数组形式返回: var fs = require('fs'); //async fs.readdir('./',function(er ...
- Ready事件与Onload事件的区别
这两种事件都是在页面文档加载时触发的,但Ready比onload先执行. 具体区别如下: 1.在Javascript中,通常使用window.onload方法. window.onload必须等到页面 ...