Delphi中如何将数组转换为指针?
有个函数,原型为WriteBuffer(pBuffer:Pointer),作用是把某些数据写到pBuffer指向的内存区域里,现在我有个Integer数组:varbufB...
有个函数,原型为WriteBuffer(pBuffer: Pointer),作用是把某些数据写到pBuffer指向的内存区域里,
现在我有个Integer数组:var bufBit: Array of Integer;
我如何把这个数组作为Pointer传给这个函数呢?是写成@bufBit,还是@bufBit[0],还是直接bufBit? 展开
现在我有个Integer数组:var bufBit: Array of Integer;
我如何把这个数组作为Pointer传给这个函数呢?是写成@bufBit,还是@bufBit[0],还是直接bufBit? 展开
5个回答
展开全部
我觉得你应该先搞清楚WriteBuffer写入的时候是按照多少字节写入的,也就是说是1字节、2字节还是其它。
一般如果仅仅是内存区域的话,我觉得按1字节的可能性最大,这样就存在问题了,你定义的是bufBit: Array of Integer; Integer在Delphi中是4字节的,你要是转化的话建议转化为Byte指针比较好:
var
BP: PByte;
begin
BP:= PBYTE(@BufBit[0]);
//处理部分
end;
呵呵,未验证,仅供参考
另外,一楼所说很有道理!
1、看你WriteBuffer的写法似乎是为了和C语法兼容,未指定长度的话可能会以 0 作为结束符,需要注意。
2、或者里面隐含处理的长度,这样的写法不安全,可能会造成未知的错误,或让程序崩溃!
一般如果仅仅是内存区域的话,我觉得按1字节的可能性最大,这样就存在问题了,你定义的是bufBit: Array of Integer; Integer在Delphi中是4字节的,你要是转化的话建议转化为Byte指针比较好:
var
BP: PByte;
begin
BP:= PBYTE(@BufBit[0]);
//处理部分
end;
呵呵,未验证,仅供参考
另外,一楼所说很有道理!
1、看你WriteBuffer的写法似乎是为了和C语法兼容,未指定长度的话可能会以 0 作为结束符,需要注意。
2、或者里面隐含处理的长度,这样的写法不安全,可能会造成未知的错误,或让程序崩溃!
2015-09-09 · 知道合伙人数码行家
可以叫我表哥
知道合伙人数码行家
向TA提问 私信TA
知道合伙人数码行家
采纳数:25897
获赞数:1464977
2010年毕业于北京化工大学北方学院计算机科学与技术专业毕业,学士学位,工程电子技术行业4年从业经验。
向TA提问 私信TA
关注
展开全部
关于DELPHI数组,指针,字符串转换的例子:
var
aa: array [0..5] of Char;
bb:Pointer;
cc:string;
dd:PChar;
procedure TForm1.Button1Click(Sender: TObject);
begin
dd:='abcdef';
//以下是pchar内容转数组
FillChar(aa,length(dd),#0);
Move(dd^,aa,SizeOf(aa));
//以下是数组传递到指针
bb:=GetMemory(SizeOf(aa));
Move(aa,bb^,SizeOf(aa));
//以下是指针内容传递给字符串
SetLength(cc,SizeOf(aa));
Move(bb^,cc[1],SizeOf(aa));
FreeMemory(bb);//这个是释放内存
//以下是数组转pchar
dd:='';
dd:=PChar(@aa);
MessageBox(0,PChar('cc: '+cc),PChar('dd: '+dd),0);
end;
var
aa: array [0..5] of Char;
bb:Pointer;
cc:string;
dd:PChar;
procedure TForm1.Button1Click(Sender: TObject);
begin
dd:='abcdef';
//以下是pchar内容转数组
FillChar(aa,length(dd),#0);
Move(dd^,aa,SizeOf(aa));
//以下是数组传递到指针
bb:=GetMemory(SizeOf(aa));
Move(aa,bb^,SizeOf(aa));
//以下是指针内容传递给字符串
SetLength(cc,SizeOf(aa));
Move(bb^,cc[1],SizeOf(aa));
FreeMemory(bb);//这个是释放内存
//以下是数组转pchar
dd:='';
dd:=PChar(@aa);
MessageBox(0,PChar('cc: '+cc),PChar('dd: '+dd),0);
end;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
@bufBit,还是@bufBit[0]
如果bufBit定义的下标是从0开始的,二种写法没有区别,效果一样。@是肯定都要带着的。
但是你的数组如果仅仅是写了“var bufBit: Array of Integer;”,肯定不能直接拿来引用。
引用前要么动态分配一下,要么直接重新定义成固定长度的数组,如array [0..BUFMAXSIZE-1]of Integer;。pascal不像C,它定义数组的下标可以不从0开始。
如果bufBit定义的下标是从0开始的,二种写法没有区别,效果一样。@是肯定都要带着的。
但是你的数组如果仅仅是写了“var bufBit: Array of Integer;”,肯定不能直接拿来引用。
引用前要么动态分配一下,要么直接重新定义成固定长度的数组,如array [0..BUFMAXSIZE-1]of Integer;。pascal不像C,它定义数组的下标可以不从0开始。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
需要另外设一个指针变量
var ptr:^integer;
begin
ptr=@bufBit[0];
WriteBuffer(ptr);
不过,很少有WriteBuffer(pBuffer: Pointer)这样只写指针的函数(一般还有个长度参数),所以所给出的只保证语法正确,不保证能正确使用WriteBuffer.
var ptr:^integer;
begin
ptr=@bufBit[0];
WriteBuffer(ptr);
不过,很少有WriteBuffer(pBuffer: Pointer)这样只写指针的函数(一般还有个长度参数),所以所给出的只保证语法正确,不保证能正确使用WriteBuffer.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
@bufBit[0]就可以了,会自动转换的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询