Delphi下使用指针的简单总结

1 :指针的赋值。
type
RTestInfo = record
Age Integer;
end;
PtestInfo = ^ RtestInfo;
var
Test1,Test2 PtestInfo;
Begin
     New(Test1);
     New(Test2);
     Test1^.Age:=12;
     Test2:=Test1;
     Application.MessageBox(Pchar(IntToStr(Test2^.Age)),’ 测试’,MB_OK);
     Test1^.Age:=13;
Application.MessageBox(Pchar(IntToStr(Test2^.Age)),’ 测试’,MB_OK);
DisPose(Test1);
DisPose(Test2);
End;
上面的代码中使用了 Test2:=Test1; 进行指针的赋值,也就是说进行赋值以后两个变量指向的相同的地址,所以当 Test1 Age 发送变化以后 Test2 Age 也随之发生了变化。反过来也是一样。那如果我们要将 Test1 中的内容放在 Test2 中并且当 Test1 中的内容发生变化的时候 Test2 的内容不会发生变化有如何来做呢?其实很简单,使用 Test2^ =Test1^ ;就可以了,这个时候变量 Test1 和变量 Test2 指向的是两个不同的地址,当一方的内容发生变化的时候另外一方不会受到影响。
 
2 :数组和指针的转换。
曾使用过 API 函数来编写网络通信的都知道,网络传输过程中传输的都是 char 类型的数组。而我们经常需要将自己定义的一个结构通过网络传输出去,并且当对方接收到这个数据以后又能将其转换为相应的结构来处理。以前我是使用添加标记位来解决这个问题。其实使用数组和指针转换是很简单的。
type
         RtestInfo = record
                   Age Integer;
         End;
Var
         Test: RtestInfo;
         Data array[0..1024] of Char;
Begin
         Test.Age:=13;
         Fillchar(Data,SizeOf(Data),#0);
         StrMove(Data,@ Test,sizeof(Test));
         // 数据发送
End;
在上面的例子中首先我们将我们定义数组 Data 清空,然后使用函数 StrMove 将结构 Test 的内容复制到 Data 中去。这个时候就可以将数据发送出去。当对方接受到数据以后,可以用以下的代码进行还原。
type
         RtestInfo = record
                   Age Integer;
         End;
Var
         Test: RtestInfo;
Begin
         StrMove(@Test,Data,sizeof(Test));
         // 处理数据
End;
这个时候就可以对发送过来的数据进行相应的处理了。
 
3 :函数指针的使用。
在分模块开发的过程中, DLL 占据着重要的位置。在我开发游戏的服务端也是使用 DLL 的方式。在开发的时候遇见这样的一个问题,例如我在一个 EXE 中编写了一个功能非常复杂的函数,在 DLL 中我想使用到它,如何做呢?其实使用函数的指针就可以很方便的实现。
我们知道 DLL 的运行空间是和调用它的 EXE 在一起的。也就是说在这个空间中的资源理论上 DLL 是都可以使用。所以只要将 exe 中的函数指针传给 DLL ,那么 DLL 就可以使用这个函数了。
例如在 DLL 中有函数 ModuleSendData 作用是让 EXE 中传入函数的指针链表,这个链表中的函数都是 DLL 中可能用到的。
 
SendDataFun: procedure(Casetype: Byte; UserSocket: RUserSocket; Data: array of char; DataLen: Integer);
 
function ModuleSendData(FunPList: TList): Boolean; stdcall; export;
begin
  SendDataFun := FunPList.Items[0];
end;
 
EXE 中的代码是:
Linstance:=LoadLibrary(Pchar(Temp));
     if Linstance>0 then
     begin
        // 将发送数据的指针传入 DLL 插件中
        @GiveModuleFun:=GetProcAddress(Linstance,'ModuleSendData');
        if @GiveModuleFun<>NIl then
        begin
          m_FunList:=TList.Create;
            // 发送数据
            t_Pointer:=@DllSendData;
            m_FunList.Add(t_Pointer);
                  GiveModuleFun(m_FunList);
                   End;
         End;
其中 DllSendData 就是我们想传入给 DLL 的函数。
 
这个时候在 DLL 中使用 SendDataFun 就和一般的函数一样了。
这里注意的一点是 Exe 中的函数 DllSendData 我定义的是一个全局函数。原因是这样取得函数的指针的时候比较简单

你可能感兴趣的:(职场,指针,Delphi,休闲)