delphi 引用的问题,怎么和C指针不一样吗,表示不解
//数据定义type DataPack = record DataPackFlag: LongInt; DataPackCurrLength: LongInt; DataPackInfo: array[1..1000] of Char;end;//注意此处的定义,实现的var 引用。。。。。。。。。。。。。。。function SendPacket(ServerSock: Tsocket; var pBuffer: PChar; iDatalength: Integer): Integer; stdcall;var tmp_iSendBytes: Integer; tmp_iTotalBytes: Integer; Buf:DataPack;begin tmp_iSendBytes := 0; tmp_iTotalBytes := 0; //Move(pbuffer^,Buf,iDatalength); //此处如果不写成pBuffer^拷贝到的内容竟然还是指针偏移了四个字节。。特别郁闷 ???????? 测试使用 if ServerSock = SOCKET_ERROR then //高人指点迷津啊??????????????、、 begin CommonSendPacket := 0; Exit; end else begin while (tmp_iSendBytes < iDatalength) do begin //调试发现为什么,使用了引用。但是传递过来的pBuffer指针指向的不是首地址呢、 //发现地址提前了四个字节即就是pBuffer+4=下面的@m_DataPackSend地址 ???? tmp_iSendBytes := send(ServerSock, pBuffer, iDatalength - tmp_iTotalBytes, 0); if tmp_iSendBytes > 0 then begin pBuffer := pBuffer + tmp_iTotalBytes; tmp_iTotalBytes := tmp_iTotalBytes + tmp_iSendBytes; end else begin SendPacket := tmp_iTotalBytes; Exit; end end; SendPacket:= tmp_iTotalBytes; endend;varm_DataPackSend:DataPack;m_pDataBuffer:PChar; //********** 调用发送函数 FillDataPack;//填充数据包结构 m_pDataBuffer:=@m_DataPackSend;//取其存储地址 tmp_iBytesCounts:=SendPacket(m_hServerSocket,m_pDataBuffer,m_DataPackSend.DataPackCurrLength);
begin //调试发现为什么,使用了引用。但是传递过来的pBuffer指针指向的不是首地址呢、 //发现地址提前了四个字节即就是pBuffer+4=下面的@m_DataPackSend地址 ???? tmp_iSendBytes := send(ServerSock, pBuffer, iDatalength - tmp_iTotalBytes, 0); //改为 send(ServerSock, pBuffer^, iDatalength - tmp_iTotalBytes, 0);function SendPacket(ServerSock: Tsocket; var pBuffer: PChar; iDatalength: Integer): Integer; stdcall;//去掉var
[解决办法]
delphi的 参数var表示可修改的变量(入参起作用,出参有效),out就是出参(入参无效,出参有效)
参数类型同变量类型
传了 var pBuffer: PChar; pBuffer可以赋值后传进去,也可以传空,在函数里面赋值当作返回值
[解决办法]
对于这种问题,我一般采用我怎么传入参数,然后函数内部比如这个move加上@是否能访问到我需要拷贝的数据,这么逆向想一下,就不容易出错。