標籤:
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的Runspace是和調用它的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:[email protected];
m_FunList.Add(t_Pointer);
GiveModuleFun(m_FunList);
End;
End;
其中DllSendData就是我們想傳入給DLL的函數。 這個時候在DLL中使用SendDataFun就和一般的函數一樣了。 這裡注意的一點是Exe中的函數DllSendData我定義的是一個全域函數。原因是這樣取得函數的指標的時候比較簡單
[轉]Delphi 指標