c#是一門解釋型語言,其中對指標進行了封裝,因此使用者無法直接呼叫物件的指標。但是當使用c#呼叫c/c++的dll時,常常會函式引數或者返回值為指標的情況。這種情況下就需要對指標進行操作。
在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型別。
c#中實現記憶體分配空間的的自動分配和**機制是使用託管記憶體來實現的,所謂託管記憶體就是由程式負責指標記憶體的分配,並通過計算指標的引用次數來判斷指標是否需要被釋放。
非託管是指將指標記憶體分配到非託管記憶體區,這裡分配的指標就需要自己分配記憶體,自己進行記憶體的**。
在c#中,可以使用unsafe宣告,來實現對指標的操作。例如
unsafe
delete ptr;
}
在unsafe模組中,可以按照c/c++的方式來使用指標。
注意:使用unsafe模組時,在c#工程屬性中勾選「允許使用不安全模組」的選項。
C 1 指標的學習
c 中的指標代表的是記憶體中的一段位址,通過指標可以直接訪問記憶體中的具體的位址。指標的定義格式 型別 變數值 int pint eg.宣告了乙個整型的指標變數 指標在宣告的時候最好進行初始化。初始化的方式如下 int pstr null include using namespace std in...
C 學習筆記 四 指標 1
函式存放在記憶體的 區域內,它們同樣有位址,我們如何能獲得函式的位址呢?如果我們有乙個int test int a 的函式,那麼,它的位址就是函式的名字,這一點如同陣列一樣,陣列的名字就是陣列的起始位址。定義乙個指向函式的指標用如下的形式,以上面的test 為例 int fp int a 這裡就定義...
C 面試 (1) 指標
指標是c 中一類頗具特色的資料型別,允許直接操作記憶體位址,實現記憶體的動態分配。指標問題通常包括指標常量,常量指標,陣列指標,指標陣列,函式指標,指標傳值等。指標和引用的區別 非空區別。在任何情況下都不能使用指向空值的引用。因此如果你使用乙個變數並讓它指向乙個物件,但是該變數在某些時候也可能不指向...