delphi指针问题

ojc520520 2013-12-13 11:16:57
function getmonsterObj():pint;//这里想返回数组中的某个成员这样可以吗?
var
monsterarr,GetMonsterList:pint;
count:integer;
i,obj:integer;

begin
GetMonsterList:= PINT(PINT(PINT(PINT(PINT($13a6888)^+$24)^+$c)^+$74)^+$14);
count:= pint(pint(Getmonsterlist)^+$14)^;
monsterarr:= pint(pint(getmonsterlist)^+$8);//这里指向数组的首地址。
for I := 0 to count do
obj:=monsterarr[i];//这里怎么取出数组中的值;
begin
if obj>0 then
begin

end;
end;

pint和pinteger好像不同是吗?
pint(pint(getmonsterlist)^+8);//这个是不是加上了8个sizeof(integer)的长度;
pint(getmonsterlist+8);//这样是不是只加上了8个字节的长度;


有点小纠结,忘高手能帮我回答以上绿色字体的部分,小弟在这不胜感激。
...全文
164 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
ojc520520 2013-12-14
  • 打赏
  • 举报
回复
引用 13 楼 sololie 的回复:
delphi 和 c++builder是同一个公司的产品,使用同一套程序框架(VCL 可视化组件库) 如果你有C++基础,用C++BUILDER比你用DELPHI写些自己都无法把控的代码好。
又是宝兰的,我怕相关的资料比delphi还少。语法和C++不知道是否完全一样。
sololie 2013-12-14
  • 打赏
  • 举报
回复
delphi 和 c++builder是同一个公司的产品,使用同一套程序框架(VCL 可视化组件库) 如果你有C++基础,用C++BUILDER比你用DELPHI写些自己都无法把控的代码好。
ojc520520 2013-12-14
  • 打赏
  • 举报
回复
引用 10 楼 sololie 的回复:
delphi 中的数组可是真正的数组,而不像c\c++中用指针去模拟的 如果你有点c\c++基础,然后又不懂delphi,可以去用c++ builder,跟delphi一样可以拖控件快速完成UI,也能用c\c++语法
和delphi一样高效吗,组件一样多吗....语法和c/c++完美一样吗(怕在去弄写法)。 没空不用回答(老麻烦你)我先百度下。
ojc520520 2013-12-14
  • 打赏
  • 举报
回复
引用 9 楼 sololie 的回复:


//monsterarr:= pint(pint(getmonsterlist)^+$8);getmonsterlist本来就是PINT,你再转PINT干什么  

  monsterarr:= pint(getmonsterlist^+$8); 
  for I := 0 to count - 1 do
  begin
    obj := monsterarr^;
    if obj > 0 then
    begin

    end;
    Inc(monsterarr); // 指针递增1,增加4个字节,指向下一个 integer
  end;
谢谢。这下满意了。老是围着 obj:=monsterarr[i];这行代码转,向取出数组里面的值
sololie 2013-12-14
  • 打赏
  • 举报
回复
delphi 中的数组可是真正的数组,而不像c\c++中用指针去模拟的 如果你有点c\c++基础,然后又不懂delphi,可以去用c++ builder,跟delphi一样可以拖控件快速完成UI,也能用c\c++语法
sololie 2013-12-14
  • 打赏
  • 举报
回复


//monsterarr:= pint(pint(getmonsterlist)^+$8);getmonsterlist本来就是PINT,你再转PINT干什么  

  monsterarr:= pint(getmonsterlist^+$8); 
  for I := 0 to count - 1 do
  begin
    obj := monsterarr^;
    if obj > 0 then
    begin

    end;
    Inc(monsterarr); // 指针递增1,增加4个字节,指向下一个 integer
  end;
ojc520520 2013-12-14
  • 打赏
  • 举报
回复
引用 6 楼 sololie 的回复:
既然该懂的都懂了,那么下面首先修改 pint(pint(getmonsterlist)^+8);//这个是不是加上了8个sizeof(integer)的长度; pint(getmonsterlist+8);//这样是不是只加上了8个字节的长度; pint(getmonsterlist^+8); // 这样getmonsterlist 加上了2个integer的长度 pint(getmonsterlist+8); // 这行代码不能编译,前面跟你说了指针类型不能跟一个数值做加减 然后问你,你到底是想+8个字节,还是想增加8*sizeof(integer) 32个字节
monsterarr:= pint(pint(getmonsterlist)^+$8);//这里指向数组的首地址。 for I := 0 to count do begin obj:=monsterarr[i];//这里怎么取出数组中的值; if obj>0 then begin ....... end; end;
ojc520520 2013-12-14
  • 打赏
  • 举报
回复
引用 6 楼 sololie 的回复:
既然该懂的都懂了,那么下面首先修改 pint(pint(getmonsterlist)^+8);//这个是不是加上了8个sizeof(integer)的长度; pint(getmonsterlist+8);//这样是不是只加上了8个字节的长度; pint(getmonsterlist^+8); // 这样getmonsterlist 加上了2个integer的长度 pint(getmonsterlist+8); // 这行代码不能编译,前面跟你说了指针类型不能跟一个数值做加减 然后问你,你到底是想+8个字节,还是想增加8*sizeof(integer) 32个字节
首先谢谢你,现在就想知道遍历数组就是上面的那种情况,要怎么写。在麻烦帮我看下。
sololie 2013-12-14
  • 打赏
  • 举报
回复
既然该懂的都懂了,那么下面首先修改 pint(pint(getmonsterlist)^+8);//这个是不是加上了8个sizeof(integer)的长度; pint(getmonsterlist+8);//这样是不是只加上了8个字节的长度; pint(getmonsterlist^+8); // 这样getmonsterlist 加上了2个integer的长度 pint(getmonsterlist+8); // 这行代码不能编译,前面跟你说了指针类型不能跟一个数值做加减 然后问你,你到底是想+8个字节,还是想增加8*sizeof(integer) 32个字节
ojc520520 2013-12-14
  • 打赏
  • 举报
回复
引用 2 楼 sololie 的回复:
pint和pinteger好像不同是吗? 自己鼠标移到pint 或 pinteger 或任意类型上,按住ctrl,点击它,就能进入这个类型的声明处, 你就知道它是怎么声明的: PINT = ^Integer; PInteger = System.PInteger; --> PInteger = ^Integer; pint,pinteger 两个都是同样的东西。 ================================ pint(pint(getmonsterlist)^+8);//这个是不是加上了8个sizeof(integer)的长度; pint(getmonsterlist+8);//这样是不是只加上了8个字节的长度; (怪物列表,在弄网游外挂吧...) getmonsterlist本身就是pint整形指针类型。 getmonsterlis^ 读出的值是否解释为一个地址,完全是取决你自己的认定 getmonsterlist 是pint,指针类型 getmonsterlist^ 是整形 delphi中一个指针类型不能直接+一个整形,getmonsterlist + 8 是不能通过编译的, 只能这样 inc(getmonsterlist,2);// 2*sizeof(integer) = 2*4 = 8字节 inc(getmonsterlist,8);// 8*sizeof(integer) = 8*4 = 32字节 如果你用内敛汇编,那就清晰得多了 var baseAddr: integer; val:Integer; begin baseAddr := $10000000; // 基址 asm mov ebx, baseAddr // ebx = $10000000 lea ebx, [ebx+8] // ebx = [$10000000+8] = pint(pint($10000000+8)^) end; end; 假设变量getmonsterlist的地址如下表 地址 偏移 值 $100000 $0 $1001121 $100004 $4 $2005445 $100008 $8 $1222222 // +8 ,inc(getmonsterlist,2); $10000C $C $2228444 integer指针每递增1,就是增加4个字节(32位系统,如果64位系统就是8字节)
唉!回答的对不上,用汇编的我找用了。32位,64位我懂,一个指针栈多少字节我懂,就是这delphi的语法写不来 现在的问题是怎么遍历数组,要怎么写?我看C语言就是定义个int型指针指向了一个int型数组就可以遍历了。如 int *p;int j; int a[5]; P=a; j=p[1]这里就取出了数组a[1]中的值。 pint(pint(getmonsterlist)^+8);//这个是不是加上了8个sizeof(integer)的长度; pint(getmonsterlist+8);//这样是不是只加上了8个字节的长度; 前面这2个我就是打个比喻。昨天临睡的时候想通了,第一个是加上了8个int型。下面那个是指针加上了8个字节不知取到了哪个地址,不是里面的地址。还有我出现混用PINT和Pinteger出现提示类型不兼容的,这里这问题可以避开。
ojc520520 2013-12-14
  • 打赏
  • 举报
回复
soloie热心人来了,谢谢
ojc520520 2013-12-14
  • 打赏
  • 举报
回复
基址加偏移的。这代码还没写完,前面的应该就可以看出了。
sololie 2013-12-14
  • 打赏
  • 举报
回复
pint和pinteger好像不同是吗? 自己鼠标移到pint 或 pinteger 或任意类型上,按住ctrl,点击它,就能进入这个类型的声明处, 你就知道它是怎么声明的: PINT = ^Integer; PInteger = System.PInteger; --> PInteger = ^Integer; pint,pinteger 两个都是同样的东西。 ================================ pint(pint(getmonsterlist)^+8);//这个是不是加上了8个sizeof(integer)的长度; pint(getmonsterlist+8);//这样是不是只加上了8个字节的长度; (怪物列表,在弄网游外挂吧...) getmonsterlist本身就是pint整形指针类型。 getmonsterlis^ 读出的值是否解释为一个地址,完全是取决你自己的认定 getmonsterlist 是pint,指针类型 getmonsterlist^ 是整形 delphi中一个指针类型不能直接+一个整形,getmonsterlist + 8 是不能通过编译的, 只能这样 inc(getmonsterlist,2);// 2*sizeof(integer) = 2*4 = 8字节 inc(getmonsterlist,8);// 8*sizeof(integer) = 8*4 = 32字节 如果你用内敛汇编,那就清晰得多了 var baseAddr: integer; val:Integer; begin baseAddr := $10000000; // 基址 asm mov ebx, baseAddr // ebx = $10000000 lea ebx, [ebx+8] // ebx = [$10000000+8] = pint(pint($10000000+8)^) end; end; 假设变量getmonsterlist的地址如下表 地址 偏移 值 $100000 $0 $1001121 $100004 $4 $2005445 $100008 $8 $1222222 // +8 ,inc(getmonsterlist,2); $10000C $C $2228444 integer指针每递增1,就是增加4个字节(32位系统,如果64位系统就是8字节)
孤独de猫 2013-12-14
  • 打赏
  • 举报
回复
你这个代码,象天书。绕来绕去,搞得这么复杂。 返回指针的要求就是: 这个对象不能是局部,除了用(GetMem, 和 Create 创建)的之外

16,747

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧