最近同事在問關於C#底層程式碼有指標的問題,具體想知道怎麽在c#中使用指標。指標在C++中比較常見,指標是一個變量,其值為另一個變量的地址,即,記憶體位置的直接地址,指標使用了需要釋放,否則會有記憶體泄漏的風險,所以C#中分配使用記憶體托管GC,自動釋放完成的記憶體資源,這樣避免了C++的風險,減輕了程式設計師的負擔。如果在C#底層開發使用受控代碼無法完成的工作可以使用指標嗎?答案是肯定的,本篇文章講述如果在C#使用指標,主要的開發工具是Visual Studio 2022。
一、環境配置
預設情況下, Visual Studio不讓使用非受控代碼,這就需要進行特殊處理,首先 需要設定計畫"內容->生成->常規"下的"不安全程式碼"打勾"允許使用「unsafe」關機鍵字編譯程式碼。"如下圖
使用不安全程式碼語法
使用時在程式碼塊和方法前面加上unsafe關鍵字,因為crl不會檢測 unsafe關鍵字下的安全,直接執行程式碼, 表明可以使用非受控代碼。
//方法
private static unsafe void Main(string[] args)
{
}
unsafe
{
//程式碼塊
}
二、指標的使用
在C#中,指標只能使用在 sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal, bool,struct(結構體),結構體中只能包括非托管型別中。參照型別不能使用指標。
整形和字元指標的使用
int num = 8;
int* ipnum = # //將num的地址賦值給ipnum
Console.WriteLine((int)&ipnum); //取ipnum的地址
Console.WriteLine(*ipnum); //取ipnum指向的值
char str = 'a';
char* ipstr = &str; //將str的地址賦值給ipstr
Console.WriteLine((int)&ipstr); //取ipstr的地址
Console.WriteLine(*ipstr); //取ipstr指向的值
結構體使用指標
struct Location
{
publicint X;
publicint Y;
}
staticunsafevoidMain(string[] args)
{
Location location;
location.X = 10;
location.Y = 5;
Location* lpstr = &location;
Console.WriteLine(string.Format("location 地址{0},lptr地址{1},lptr值{2}", (int)&location, (int)lpstr, *lpstr));
Console.WriteLine(string.Format("location.x的地址{0},location.x的值{1}", (int)&(lpstr->X), lpstr->X));
}
指標與參數
publicstaticunsafechar* getchar(char* c)
{
char ptr = *c;
return &ptr;
}
//呼叫
char c = 'a';
Console.WriteLine(*getchar(&c));
三、指標的定義和操作符
指標的定義語法:
int* p整形指標
int** p指向整形指標的指標
char* c指向字元的指標
int*[] arr整形一維陣列指標
指標的操作符:
*取值運算子
&取址運算子
->透過指標處理結構體中的數據(獲取或賦值)
++與–指標增、減操作
fixed使用者暫時固定受控代碼中參照型別的位置。
Stackallc分配記憶體
//例如分配記憶體
char* cpstr = stackallocchar[20];
結語
本文簡單介紹了指標的使用,更多使用可以參考微軟官網,比如指標與類的使用,大家感興趣可以研究一下。C#使用指標不是很方便,如果學習指標還是建議大家用c++,.NET框架也不推薦使用指標,指標的使用僅供學習,如果很底層開發建議用C++。關於c#指標歡迎留言討論。
版權聲明:本文來源於網友收集或網友提供,僅供學習交流之用,如果有侵權,請轉告版主或者留言,本公眾號立即刪除。