指针地址的运算问题 ( 积分: 50 )

  • 主题发起人 主题发起人 ddzhouqian
  • 开始时间 开始时间
D

ddzhouqian

Unregistered / Unconfirmed
GUEST, unregistred user!
我在对指针指向的区域进行赋值的时候,遇到了如下的问题
具体见代码
type
pbyte=^byte;
var
p1:pbyte;
begin
getmem(p1,100);
p1^=$10;
inc(p1,10);
p1^:=$20;
//注意此时我想对inc(p1,5)进行赋值如何操作?也就是首地址+5的位置进行赋值,该指针当前的地址已经是首地址+10的位置.当然你会和我说用inc(p1,-10+5);我不想这样,在写的程序中你不可能时时的记住你的指针位移偏量,我只想用最符合常里的方式,首地址+当前将要移动的偏移量就好了,请各位帮帮忙.
end;
 
你这种做法本来就不 "符合常里".

var
p1: PByteArray;
begin
getmem(p1,100);
p1[0]=$10;
p1[10]:= $20

end;
 
你这样操作不安全。经过系列的操作后,p1指向那里的都不道了,会造成无法释放内存。你应该增加一个指针来来执行操作。
type
pbyte=^byte;
var
p1,p2:pbyte;
begin
getmem(p1,100);
try
p2=p1;
p2^=$10;
inc(p2,10);
p2^:=$20;
finally
freemem(p1,100);
end;
 
不是小弟不合常里啊,是小弟在改vc的代码,需要改成delphi 的
vc里就是这样的啊
unsigned char *bitsBuffer;
bitsBuffer = (unsigned char *)malloc(128 * 128 * 2);
int pos;
pos:
bitsBuffer[pos] = y;
 
白河愁的思路对但方法是不对的,要这样:
p1^[5]:= $20;
不要去改动p1的值。
 
晕,写完一看,掉了几楼。
我经常跟qqjm一样做,一般用指针都是小心翼翼地一次用俩,怕移动到自己都忘了,留一个做备份。

其实心里也是没底,难道这样就是最好的方法?

白河功夫够好!但如果LZ用一个RECORD,指针就好象有一点优势吧。
 
我的方法指针不会变,可以正常释放。
具体可以看下 PByteArray 的定义,不存在 p1^ 的问题。

说起来惭愧,这个问题很久以前问过,不过当时还是不明白。
随着对指针加深了解,才知道是怎么回事。
 
我试了一下,p[X]这样直接使用,只能在p定义为为 pchar类型时才可以。
p是其他指针类型时这样使用编译器报错,要用如下方法转换,下面以pinteger类型为例

var p:pinteger;
begin
getmem(p,10);
pinteger(integer(p)+3)^:= 2;
showmessage(inttostr(pinteger(integer(p)+3)^));
freemem(p);
 
刚才看了一下 PXXXArray类型的定义。
楼主的问题,白河愁是正确的。
使用方式比我的代码简洁。
 
呵呵,我刚用了数组做了,好像是可以的,现在还在测试阶段,其他两种方式还没试,我觉得用两个指针,一个用做备份首地址,一个进行操作,理论上是可以的.白河愁的方法我觉得如果能够尝试成功的话,该问题就简化了,思路确实不错.试过一定告知.开始测试中..............
 
1.白河愁的方法已经测试过了,可以的,和我最终用的静态数组的方式是一样的,没什么太大区别.
2.另外ufo说白的写法有误,其实在DELPHI里是允许这样写的,可以说是相等的(var p1: PByteArray;p1[0]=$10;与p1^[0]是可以划等号的,我个人比较喜欢第二种写法,因为看到后知道是指针),我想这个DELPHI编译器可能会自动处理的,只是猜测,呵呵
3.白的方法也不是通用的,我个人觉得,因为PByteArray类型是指向一个静态数组的,那么他就有限制了.这是DELPHI里的定义
PByteArray = ^TByteArray;
TByteArray = array[0..32767] of Byte;
如果我传的下标值大于32767那么会怎么样,我还没尝试过,我想可能有问题,只是猜测。
4.qqjm的方法我还没试,虽然我一开始想的是这种方法,呵呵。
 
说明一下,我刚开始说白的方法有误,是因为我没看仔细他申明的是数组类型。
确实,申明为 PXXXArray 类型时,加不加 ^ 符号都能访问,但不加 ^ 效率更高,加上^符号后多了一步mov操作。
另外,如果下标大于 32767则编译器会提示下标越界,这个可以通过自定义一个大点的指针数组解决。
 
呵呵
确实,我看了,发了后,看到你说的,呵呵,说错人了
如果不加^比加了^速度更快!可否讲讲原理啊?
至于pbytearray确实可以修改的,我只是说下,其实还是得自己定义得,白兄的其实是个思路,我现在明白了,不好意思,呵呵
 
加了^符号更慢,我是看delphi生成的汇编的,多了一步mov。大致意思如下:
p^[X]:=5;
值5存入寄存器
寄存器内的值写入p+地址偏移X处

p[X]:=5;
值5写入p+地址偏移X处
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
D
回复
0
查看
909
DelphiTeacher的专栏
D
D
回复
0
查看
704
DelphiTeacher的专栏
D
后退
顶部