1 type 2 Pint = ^Integer; //Pint 为类型 = 号 3 var 4 i : Integer; 5 pi : PInteger; 6 Pintd : ^Integer; //Pintd为变量 : 号 7 begin 8 i := 100; 9 pi := @i; 10 pi^ := 102; 11 ShowMessage(IntToStr(pi^)); 12 Pintd := @i; 13 Pintd^ := 104; 14 ShowMessage(IntToStr(pi^)); 15 end; 内存中的数据除了 0 便是 1, 你把它当作图片、字符、数字等等, 那是你的事, 内存只认识 0 和 1. var str: string; n: Cardinal; pstr: PString; begin str := 'ABCDE'; n := Cardinal(str); {获取内存地址} pstr := @str; {现在 pstr 是 str 的指针} {n 与 pstr 的数字结果是(结果是随机的, 知道不一样就行了):} ShowMessage(IntToStr(n)); {4571092} ShowMessage(IntToStr(Cardinal(pstr))); {1244652} {但通过 pstr 可以找到 str} ShowMessage(pstr^); {ABCDE} end; 程序运行后, 字符串所在的内存基本上是下面这个样子(以字节为单位), 上例中的 n 标识着 ↓ 的位置:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var str: string; ps: PChar; n: Cardinal; begin str := 'ABCDE'; ps := PChar(str); n := Cardinal(ps); //n := Cardinal(str); {这行可以代替上面两行} ShowMessage(IntToStr(n)); {结果是 Windows 随机管理的} ShowMessage(PChar(n)); {ABCDE} ShowMessage(PChar(n+1)); {BCDE} ShowMessage(PChar(n+2)); {CDE} ShowMessage(PChar(n+3)); {DE} ShowMessage(PChar(n+4)); {E} end; procedure TForm1.Button2Click(Sender: TObject); var str: string; n: Cardinal; pb: PByte; begin str := 'ABCDE'; n := Cardinal(str); ShowMessage(IntToStr(n)); {4571140; 这是我这里的结果, 这是随机的} pb := PByte(n); ShowMessage(IntToStr(pb^)); {65} pb := PByte(n+1); ShowMessage(IntToStr(pb^)); {66} end; procedure TForm1.Button3Click(Sender: TObject); var str: string; n: Cardinal; pint: PInteger; begin str := 'ABCDE'; n := Cardinal(str); ShowMessage(IntToStr(n)); {4571140; 这是我这里的结果, 这是随机的} pint := PInteger(n); ShowMessage(IntToStr(pint^)); {1145258561} pint := PInteger(n+1); ShowMessage(IntToStr(pint^)); {1162101570} end; end. 上面的第三个程序段的结果或许让你迷惑: ---------------------------------------------------------------------------------------------------------------------------- FeedBack: #1楼maxcool[未注册用户]
#2楼maxcool[未注册用户]
我对指针的理解,万一老师看对不对
回复引用
其实指针记录的是某个变量的数据的内存地址。 就好像是个索引。 比如图书馆有本书,拿到书的指针等于其实等于拿到那本书的具体位置,例如某排某列。而要拿到那本书,要追踪到这个指针的具体地址。换句话说,拿到指针,只拿到一张纸条(上面记录书的具体位置);要拿到书这个物品,要根据这个纸条上的地址去取。指针怎么跟藏宝地图似的呵呵。 指针的指针相当于什么,相当于这个记录书位置纸条的位置。。。。不知道会不会变态到指针的指针的指针,估计没有需要吧? 警察破案,找到张三,张三供出李四,那么张三就是李四的指针,李四供出王五,那么李四就是王五的指针。张三就是五五指针的指针。。。。。 以上理解对不,请万一老师与各位访客批评指正!
#6楼wuzhong[未注册用户]
#11楼厨师[未注册用户]
#13楼厨师[未注册用户]
#17楼Delphier[未注册用户]
--引用--------------------------------------------------
回复引用
万一: @厨师: <br>譬如一个四字节的整数 1145258561, 它的十六进制表示是: $44434241, 每个字节分别是: $44 $43 $42 $41, 但 Inter CPU 是这样安排它们的: $41 $42 $43 $44, 这就是我说的 "倒" 着. <br> <br>关于 "为什么不是pchar(n)^ 后几个都是用了^啊?" <br>因为后面几个都是定义的指针类型, 譬如: pb: PByte; pint: PInteger; <br> -------------------------------------------------------- 譬如一个四字节的整数 1145258561,这不是五个字节吗?晕了
#23楼dragon10001[未注册用户]
万一老师:
回复引用
你好! 在您的博客上学到的东西比看书真是实在! 上面的例子我在d2009中测试了下,发现如果如以下语句,d2009会出现乱码: ShowMessage(PChar(n)); {ABCDE} ShowMessage(PChar(n+1)); {BCDE} ShowMessage(PChar(n+2)); {CDE} ShowMessage(PChar(n+3)); {DE} ShowMessage(PChar(n+4)); {E} 改为: ShowMessage(PChar(n)); {ABCDE} ShowMessage(PChar(n+2)); {BCDE} ShowMessage(PChar(n+4)); {CDE} ShowMessage(PChar(n+6)); {DE} ShowMessage(PChar(n+8)); {E} 运行正常! 想来是d2009的string类型默认的是unicode字符吧!
#25楼wt_yxs[未注册用户]
procedure TForm1.Button1Click(Sender: TObject);
回复引用
var a:string; n: Cardinal; begin a:='万一'; n:=Cardinal(a); //结果是随机的, 知道不一样就行了 我想要的是变量a的内存地址,这里OK,请往下 edit1.Text:=inttostr(n); end; procedure TForm1.Button2Click(Sender: TObject); var a:char; n: Cardinal; begin a:='A'; n:=Cardinal(a); edit2.Text:=inttostr(n); //请问为啥这里返回65? 我想要的是变量a的内存地址 end; procedure TForm1.Button3Click(Sender: TObject); var a:integer; n: Cardinal; begin a:=123; n:=Cardinal(a); edit3.Text:=inttostr(n); //请问为啥这里还是返回123? 我想要的是变量a的内存地址 end; 请万老师费心一下! 万老师,您好。
回复引用
我有个问题想请教您,不知道你有没有时间给我解答? 我正在开发一个管理系统,我想使用类似WEB网页那种SESSION记录的方式来记录登陆用户或者其它一些程序关闭后即失效的东西。请问我的想法对吗?下面我说下我的想法。 由于主程序只涉及界面方面的代码,因此所有数据模块和存取操作等都是利用DLL来进行的。现在有个问题就是,有些操作需要验证使用者权限,或者检查“是否属于超级管理模式”。 以毅然是将登陆信息保存到数据库,但后来发现这种方式很不好。我想将这些数据保存到内存中(由主程序来保存)。动态链接库通过访问这个数据来确认是否已经登陆。当然为了安全,我需要做成类似WEB网页的SESSION那种session('loginname')='xxxx',的样子。我知道session可以弄成一个函数,来获得''中间的loginname变量的值。这应该不难。只是对指针不了解,想您给我讲解一下,指针的几个表示方式的意思。比如:^p,p^这两个各表示什么?是否在前面加一个p的类型都是该类型的指针类型?pinteger是一个指针类型,它读取内存数据是以integer类型来读取的,这样理解对不? 谢谢。 指针与win的handle还不一样,文章说直接操作内存,那是对win相当的不了解,毕竟现在不是dos的原始年代
参考:http://www.cnblogs.com/del/archive/2008/03/07/1094655.html |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13