首页
社区
课程
招聘
[求助]delphi 指针 pointer 的疑问
发表于: 2009-5-5 20:24 10247

[求助]delphi 指针 pointer 的疑问

2009-5-5 20:24
10247
delphi 中我们知道 pointer($000FFAB11) 会直接返回一个指向内存地址000FFAB11的指针.

但如果这样用:
var s:string;
s:='abcd';
pointer(s); 这样又代表什么意思呢?

测试时发现,pointer(s); 返回的是abcd在内存中的址,有点不太明白是怎么个说法..

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
2
意思就是将s字符串类型的指针强制转换成Pointer类型的指针。
2009-5-5 20:58
0
雪    币: 102
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
delphi 教课书里有写。再去看看书!我都还记得。呵呵
2009-5-6 09:00
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
delphi里的string可以看成是动态数组
s可以看成个指针变量 该指针变量指向实际的字符串
2009-5-6 10:31
0
雪    币: 126
活跃值: (179)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
String本来就是一个指针.
指向的内容是String的数据内容.负偏移存放的是长度,引用计数(D2009加了多语言相关的).
因为String本来就是指针,所以也就没啥说的了
2009-5-6 10:41
0
雪    币: 1283
活跃值: (46)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
string的结构在Delphi源代码剖析上讲的很清楚了
pointer(s)指的应该S的引用计数,也就是String[0]
0的前一个字节是字符串的字符数字
所以我们可以获得其字符个数方法如下:
function StrLen(const str: string): integer;
asm
  move eax,eax-4
end;
2009-5-6 11:43
0
雪    币: 22
活跃值: (48)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
string是指针。牢记牢记,谢谢。
观察strtoint(s);     那integer是指针不。s的本性不应该变的!
2009-5-7 05:45
0
雪    币: 204
活跃值: (76)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
var s:string;
其中s就是指针了,指向字符串首地址,可以当PChar来用
但是delphi给它赋予更多的功能,比如生命周期的管理。。。。。。
2009-5-7 11:56
0
雪    币: 296
活跃值: (89)
能力值: ( LV15,RANK:340 )
在线值:
发帖
回帖
粉丝
9
Delphi源代码剖析字符串相关部分有介绍,实际上String(长字符串)是个指针。

var s:string; // 这个在栈上分配一个s的指针
// (注意String是长字符串,存储方式和普通的短字符串不同)
s:='abcd'; // 指针内容指向堆中的字符串结构,格式如下
// 偏移: -8 -4 0 1 2 3 4
// 内容: 0 4 a b c d #0
// 解释:引用计数 长度 串内容 #0

// s的指针就指向偏移为0的位置


所以你 pointer(s) 强制转型得到的是指向 'abcd',#0 的指针。不知道这样说你明白没
2009-5-7 21:32
0
雪    币: 5
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
这几天有个认识了,看了你的介绍.更明白了.

另外,再请教一下:
这里,@S也是取S的内存地址,
和pointer(s)取的有什么区别?
2009-5-8 07:14
0
雪    币: 0
活跃值: (954)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
11
数据类型转换的问题,百度里面一大堆。。

比如api 里面有个函数用到字符串指针,pchar(a)

强制转换成该数据类型!
2009-5-8 08:10
0
游客
登录 | 注册 方可回帖
返回
//