[轉]Delphi 指標

來源:互聯網
上載者:User

標籤:

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 指標

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.