手把手教你C#中指標的使用方法
#C#是一門解釋型語言,其中對指標進行了封裝,因此用戶無法直接呼叫物件的指標。但是當使用C#呼叫C/C 的DLL時,常常會函數參數或傳回值為指標的情況。這種情況下就需要對指標進行操作。
在C#中使用指針,需要先回答以下幾個問題:
1.C#提供了哪幾種指針型別
C#提供的指標為IntPtr或UIntPtr,用來表示指標或句柄的平台特定類型。因此,IntPtr 可以用來表示指標或句柄、它是一個平台特定型別。
1.1 IntPtr用在什麼地方
(1)C#呼叫WIN32 API時
(2)C#呼叫C/C 寫的DLL時(其實和1相同,只是這個一般是我們在和他人合作開發時常用到)
#1.2 如何使用IntPtr
例如有一函數原型定義為:
DllDemoAPI DLLGen* DLLGen_Create(HWND hWnd);
那麼我們在C#中引用時就要這樣寫:
[DllImport("DLLGen.dll", EntryPoint = "DLLGen_Create", CallingConvention = CallingConvention.Cdecl)] public extern static IntPtr DLLGen_Create(IntPtr hWnd);
這裡涉及到C#類型與C 類型的對應關係,常用到的幾種如下:
(1)void *可以直接轉換為IntPtr。
(2)char *在C#中對應的為string類型。
2. 託管和非託管有什麼不同
C#中實現記憶體分配空間的的自動分配和回收機制是使用託管記憶體來實現的,所謂託管記憶體是由程式負責指標記憶體的分配,並且透過計算指標的引用次數來判斷指標是否需要被釋放。
非託管是指將指標記憶體分配到非託管記憶體區,這裡分配的指標就需要自己分配內存,自己進行記憶體的回收。
3. 如何向在C/C 中一樣使用指標
在C#中,可以使用unsafe聲明,來實現對指標的操作。例如
unsafe { int *ptr = new int[100]; for (int i = 0; i < 100; i++) { *(ptr+i) = i; } delete[] ptr; }
在unsafe模組中,可以按照c/c 的方式來使用指標。
注意:使用unsafe模組時,在C#工程屬性中勾選「允許使用不安全模組」的選項。
感謝大家的閱讀,希望大家收益多多。
本文轉自:https://blog.csdn.net/menjiawan/article/details/48677455
推薦教學:《C語言》
以上是手把手教你C#中指針的使用方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!