散分!讨论Delphi动态指针的问题。

flyinwuhan 2003-10-19 05:38:17
先声明一个使用动态指针的纪录类型:
type
TTest = record
dw : DWORD;
ary : Array of DWORD;
end;
pTest = ^TTest;

然后:
var
test : PTest;
p : PDWORD;
begin
test := AllocMem( sizeof(TTest) + sizeof(dword) * 2 );

setlength(test.ary,2);
test.dw :=12345;
test.ary[0] := 111;
test.ary[1] := 222;

p := PDWORD(test);//强制转化指针类型
Inc(p);
p^ := 333;

if P^ = test.ary[0] then ...//问题来了,此句引发异常,
//如果改为:
if P^ = PTset(test).ary[0] then...//再转化回来,也不行!


问题是:
1:delphi的强制指针转化是否可逆?
2:据说delphi动态指针是系统管理的,也就是说,我申请内存后,test.ary[0]在内存中的位置并不是紧接着test.dw, 上例中,改变了P^的值并不会改变test.ary[0],对吗?

问题可能有点难,讨论一下吧!
...全文
44 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
flyinwuhan 2003-10-19
  • 打赏
  • 举报
回复
哈哈哈!

确实!PWORD(p^)^:= 333;这样不会破坏test.

各位,解分!
pankun 2003-10-19
  • 打赏
  • 举报
回复
P := DWORD(Text)后, Text本身并没有改变!!
pankun 2003-10-19
  • 打赏
  • 举报
回复
怎么可能转化了又找不回原来的数据,我觉得这只是你自己的问题.
flyinwuhan 2003-10-19
  • 打赏
  • 举报
回复
可是!
我不想因为把test强制转化为pdword后就不用它了,怎么再把它转化回来呢?

或者Delphi中可不可以像C那样(PDWORD)Test 而不改变test的类型呢?
注意:
c可以这样:
(PDWORD)Test //得到了想要的但是并没有对test强制转化。
PDWORD(Test)//强制转化。

附:如果强制转化了带有动态数组的指针而又没办法找回原来的数据,Delphi也太差了,我决定放弃她!
hiflower 2003-10-19
  • 打赏
  • 举报
回复
p := PDWORD(test);//强制转化指针类型
Inc(p); //这里 p 的内容是指向 ary[0] 的指针值,而不是 ary[0] 本身
PWORD(p^)^:= 333; //再转换一次就行了,。
pankun 2003-10-19
  • 打赏
  • 举报
回复
我调试了的,PWORD(p^)^ := 333;后test.ary[0] := 333;
hatedeadlock 2003-10-19
  • 打赏
  • 举报
回复
PWORD(p^)^ 这样也不行 (但肯定不会出现异常)
但是P^绝对不是 楼主的结果
pankun 2003-10-19
  • 打赏
  • 举报
回复
上在应改写成这样
PWORD(p^)^ := 333;
就是指向这个指针指向的数据
pankun 2003-10-19
  • 打赏
  • 举报
回复
1:可逆 text := PText(P);
2:是紧跟着的.但上面是动态数据,只是存放的一个指向数组的指针,所以你改P^后,Test这个动态数组指针就不对了,所以出错.如果不是动态数组就不会出现这个问题.
ehom 2003-10-19
  • 打赏
  • 举报
回复
问题很简单,在此记录类型中ary是动态数组,那么这里的ary存储的是指针(否则),也就是说+ sizeof(dword) * 2就是多余的,sizeof(TTest)得到的就是记录类型的字节数,包括了指针.

由此得出
1.当然可以,很容易自己试出来,也很容易理解
2.记录中的数据当然连续,也很容易试出来,不是吗?
因权限不够,只能上传20M,故分两部分上传 提供了有关使用算法和数据结构的一个详尽的介绍。Bucknall先从算法性能的讨论开始,涵盖了诸如数组、链表和二叉树等内容。这本书强调了查找算法(如顺序和二分查找),另外也重点介绍了排序算法(包括冒泡排序、插入排序、希尔排序、快速排序和堆排序),此外还提供了有关的优化技术。不仅如此,作者还介绍了散列和散列表、优先队列、状态机和正则表达式以及诸如哈夫曼和LZ77等数据压缩技术。 随附光盘中有作者所开发的一个相当成功的自由软件库EZDSL,另外还有可运行于各版本Delphi上和Kylix上的源代码,此外还提供了TurboPower Software公司的可执行程序。 目录 前言 致谢 第1章什么是算法 1.1什么是算法 1.2算法和平台 1.3调试与测试 1.4小结 第2章数组 2.1数组 2.2Delphi中的数组类型 2.3TList类和指针数组 2.4磁盘数组 2.5小结 第3章链表、栈和队列 3.1单链表 3.2双向链表 3.3链表的优缺点 3.4栈 3.5队列 3.6小结 .第4章查找 4.1比较例程 4.2顺序查找 4.3二分查找 4.4小结 第5章排序 5.1排序算法 5.2排序基础知识 5.3小结 第6章随机算法 6.1随机数生成 6.2其他随机数分布 6.3跳表 6.4小结 第7章散列和散列表 7.1散列函数 7.2利用线性探测方法实现冲突解决 7.3其他开放定址机制 7.4利用链式方法解决冲突 7.5利用桶式方法解决冲突 7.6磁盘上的散列表 7.7小结 第8章二叉树 8.1创建一个二叉树 8.2叉树的插入和删除 8.3二叉树的遍历 8.4二叉树的类实现 8.5二叉查找树 8.6伸展树 8.7红黑树 8.8小结 第9章 优先队列和堆排序 9.1优先队列 9.2堆 9.3堆排序 9.4扩展优先队列 9.5小结 第10章 状态机和正则表达式 10.1状态机 10.2正则表达式 10.3小结 第11章数据压缩 11.1数据表示 11.2数据压缩 11.3位流 11.4最小冗余压缩 11.5字典压缩 11.6小结 第12章 高级主题 12.1读者-写者算法 12.2生产者-消费者算法 12.3查找两文件的差别 12.4小结 后记
因权限不够,只能上传20M,故分两部分上传 提供了有关使用算法和数据结构的一个详尽的介绍。Bucknall先从算法性能的讨论开始,涵盖了诸如数组、链表和二叉树等内容。这本书强调了查找算法(如顺序和二分查找),另外也重点介绍了排序算法(包括冒泡排序、插入排序、希尔排序、快速排序和堆排序),此外还提供了有关的优化技术。不仅如此,作者还介绍了散列和散列表、优先队列、状态机和正则表达式以及诸如哈夫曼和LZ77等数据压缩技术。 随附光盘中有作者所开发的一个相当成功的自由软件库EZDSL,另外还有可运行于各版本Delphi上和Kylix上的源代码,此外还提供了TurboPower Software公司的可执行程序。 目录 前言 致谢 第1章什么是算法 1.1什么是算法 1.2算法和平台 1.3调试与测试 1.4小结 第2章数组 2.1数组 2.2Delphi中的数组类型 2.3TList类和指针数组 2.4磁盘数组 2.5小结 第3章链表、栈和队列 3.1单链表 3.2双向链表 3.3链表的优缺点 3.4栈 3.5队列 3.6小结 .第4章查找 4.1比较例程 4.2顺序查找 4.3二分查找 4.4小结 第5章排序 5.1排序算法 5.2排序基础知识 5.3小结 第6章随机算法 6.1随机数生成 6.2其他随机数分布 6.3跳表 6.4小结 第7章散列和散列表 7.1散列函数 7.2利用线性探测方法实现冲突解决 7.3其他开放定址机制 7.4利用链式方法解决冲突 7.5利用桶式方法解决冲突 7.6磁盘上的散列表 7.7小结 第8章二叉树 8.1创建一个二叉树 8.2叉树的插入和删除 8.3二叉树的遍历 8.4二叉树的类实现 8.5二叉查找树 8.6伸展树 8.7红黑树 8.8小结 第9章 优先队列和堆排序 9.1优先队列 9.2堆 9.3堆排序 9.4扩展优先队列 9.5小结 第10章 状态机和正则表达式 10.1状态机 10.2正则表达式 10.3小结 第11章数据压缩 11.1数据表示 11.2数据压缩 11.3位流 11.4最小冗余压缩 11.5字典压缩 11.6小结 第12章 高级主题 12.1读者-写者算法 12.2生产者-消费者算法 12.3查找两文件的差别 12.4小结 后记

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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