先声明一个使用动态指针的纪录类型:
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],对吗?问题可能有点难,讨论一下吧!

解决方案 »

  1.   

    问题很简单,在此记录类型中ary是动态数组,那么这里的ary存储的是指针(否则),也就是说+ sizeof(dword) * 2就是多余的,sizeof(TTest)得到的就是记录类型的字节数,包括了指针.由此得出
    1.当然可以,很容易自己试出来,也很容易理解
    2.记录中的数据当然连续,也很容易试出来,不是吗?
      

  2.   

    1:可逆 text := PText(P);
    2:是紧跟着的.但上面是动态数据,只是存放的一个指向数组的指针,所以你改P^后,Test这个动态数组指针就不对了,所以出错.如果不是动态数组就不会出现这个问题.
      

  3.   

    上在应改写成这样
      PWORD(p^)^ := 333;
    就是指向这个指针指向的数据
      

  4.   

    PWORD(p^)^ 这样也不行 (但肯定不会出现异常) 
    但是P^绝对不是 楼主的结果
      

  5.   

    我调试了的,PWORD(p^)^ := 333;后test.ary[0] := 333;
      

  6.   

    p := PDWORD(test);//强制转化指针类型
      Inc(p);  //这里 p 的内容是指向 ary[0] 的指针值,而不是 ary[0] 本身
      PWORD(p^)^:= 333; //再转换一次就行了,。
      

  7.   

    可是!
    我不想因为把test强制转化为pdword后就不用它了,怎么再把它转化回来呢?或者Delphi中可不可以像C那样(PDWORD)Test 而不改变test的类型呢?
    注意:
    c可以这样:
    (PDWORD)Test //得到了想要的但是并没有对test强制转化。
    PDWORD(Test)//强制转化。附:如果强制转化了带有动态数组的指针而又没办法找回原来的数据,Delphi也太差了,我决定放弃她!
      

  8.   

    P := DWORD(Text)后, Text本身并没有改变!!
      

  9.   

    哈哈哈!确实!PWORD(p^)^:= 333;这样不会破坏test.各位,解分!