首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

delphi 引用的有关问题,如何和C指针不一样吗,表示不解

2012-09-25 
delphi引用的问题,怎么和C指针不一样吗,表示不解Delphi(Pascal) code//数据定义typeDataPack recordData

delphi 引用的问题,怎么和C指针不一样吗,表示不解

Delphi(Pascal) code
//数据定义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);



我要实现条用函数传递指针地址,被调用函数实现操作。这样写不对吗??

大家有什么办法,西望不吝赐教。

[解决办法]
PChar本身就是指针类型咯,pBuffer当然是一个地址。
[解决办法]
var传递就是引用传递,Pchar就是指针,对指针 var ,是指针的指针
[解决办法]
楼主的想法,时实现指针传递。。

其实指针本省就是引用。。

指针地址必须是唯一的。所以你的var显然就成了多余的。

Delphi(Pascal) code
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加上@是否能访问到我需要拷贝的数据,这么逆向想一下,就不容易出错。

热点排行