亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C#指針變量與unsafe的實現(xiàn)

 更新時間:2023年03月31日 11:10:56   作者:C語言中文網(wǎng)  
本文主要介紹了C#指針變量與unsafe的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

為了保持類型的安全性,默認情況下 C# 是不支持指針的,但是如果使用 unsafe 關鍵字來修飾類或類中的成員,這樣的類或類中成員就會被視為不安全代碼,C# 允許在不安全代碼中使用指針變量。在公共語言運行時 (CLR) 中,不安全代碼是指無法驗證的代碼,不安全代碼不一定是危險的,只是 CLR 無法驗證該代碼的安全性。因此 CLR 僅會執(zhí)行信任程序集中包含的不安全代碼。

指針變量

在 C# 中,指針同樣是一個變量,但是它的值是另一個變量的內(nèi)存地址,在使用指針之前我們同樣需要先聲明指針,聲明指針的語法格式如下所示:

type* var_name;

下表中列舉了一些定義指針的示例:

示例說明
int* pp 是指向整數(shù)的指針
double* pp 是指向雙精度數(shù)的指針
float* pp 是指向浮點數(shù)的指針
int** pp 是指向整數(shù)的指針的指針
int*[] pp 是指向整數(shù)的指針的一維數(shù)組
char* pp 是指向字符的指針
void* pp 是指向未知類型的指針

與聲明變量相同,我們同樣可以在一行代碼中同時聲明多個指針,如下所示:

int* p1, p2, p3; ?// 定義 p1、p2、p3 三個整數(shù)指針

注意:指針類型不能從對象中繼承,并且裝箱和拆箱也不支持指針,但是不同的指針類型以及指針與整型之間可以進行轉(zhuǎn)換。

【示例】下面通過示例演示 C# 中 unsafe 關鍵字和指針的使用:

using System;
namespace jb51.net
{
? ? class Demo
? ? {
? ? ? ? static unsafe void Main(string[] args)
? ? ? ? {
? ? ? ? ? ? double f = 3.1415;
? ? ? ? ? ? double* p = &f;
? ? ? ? ? ? Console.WriteLine("數(shù)據(jù)的內(nèi)容是: {0} ", ?f);
? ? ? ? ? ? Console.WriteLine("數(shù)據(jù)在內(nèi)存中的地址是: {0}", ?(int)p);
? ? ? ? ? ? Console.ReadKey();
? ? ? ? }
? ? }
}

運行結果如下:

字符串的內(nèi)容是: 3.1415
字符串在內(nèi)存中的地址是: 11530344

提示:在編譯上述代碼時需要在編譯命令中添加-unsafe,例如csc -unsafe demo.cs。

使用指針檢索數(shù)據(jù)的值

在 C# 中,我們可以使用 ToString() 來獲取指針變量所指向的數(shù)據(jù)的值,如下例所示:

using System;
namespace jb51.net
{
    class Demo
    {
        public static void Main()
        {
            unsafe
            {
                int var = 123456;
                int* p = &var;
                Console.WriteLine("變量 var 的值為: {0} " , var);
                Console.WriteLine("指針 p 指向的值為: {0} " , p->ToString());
                Console.WriteLine("指針 p 的值為: {0} " , (int)p);
            }
            Console.ReadKey();
        }
    }
}

運行結果如下:

變量 var 的值為: 123456
指針 p 指向的值為: 123456
指針 p 的值為: 13889084

將指針作為參數(shù)傳遞給函數(shù)

我們可以將指針變量作為參數(shù)傳遞給函數(shù),如下例所示:

using System;
namespace jb51.net
{
    class Demo
    {
        public unsafe void swap(int* p, int *q)
        {
            int temp = *p;
            *p = *q;
            *q = temp;
        }
        public unsafe static void Main()
        {
            Demo p = new Demo();
            int var1 = 10;
            int var2 = 20;
            int* x = &var1;
            int* y = &var2;
            Console.WriteLine("調(diào)用 Swap 函數(shù)前: var1:{0}, var2: {1}", var1, var2);
            p.swap(x, y);
            Console.WriteLine("調(diào)用 Swap 函數(shù)后: var1:{0}, var2: {1}", var1, var2);
            Console.ReadKey();
        }
    }
}

運行結果如下:

調(diào)用 Swap 函數(shù)前: var1:10, var2: 20
調(diào)用 Swap 函數(shù)后: var1:20, var2: 10

使用指針訪問數(shù)組元素

在 C# 中,數(shù)組和指向該數(shù)組且與數(shù)組名稱相同的指針是不同的數(shù)據(jù)類型,例如int* p和int[] p就是不同的數(shù)據(jù)類型。您可以增加指針變量 p 的值,因為它在內(nèi)存中不是固定的,但數(shù)組地址在內(nèi)存中是固定的,因此您不能增加數(shù)組 p 的值。如果您需要使用指針變量訪問數(shù)組數(shù)據(jù),可以像我們在 C 或 C++ 中所做的那樣,使用 fixed 關鍵字來固定指針。下面通過示例演示一下:

using System;
namespace jb51.net
{
    class Demo
    {
        public unsafe static void Main()
        {
            int[]  list = {10, 100, 200};
            fixed(int *ptr = list)
            /* 顯示指針中數(shù)組地址 */
            for ( int i = 0; i < 3; i++)
            {
                Console.WriteLine("list[{0}] 的內(nèi)存地址為:{1}",i,(int)(ptr + i));
                Console.WriteLine("list[{0}] 的值為:{1}", i, *(ptr + i));
            }
            Console.ReadKey();
        }
    }
}

運行結果如下:

list[0] 的內(nèi)存地址為:51981272
list[0] 的值為:10
list[1] 的內(nèi)存地址為:51981276
list[1] 的值為:100
list[2] 的內(nèi)存地址為:51981280
list[2] 的值為:200

編譯不安全代碼

為了編譯不安全代碼,在編譯時必須使用unsafe命令,例如編譯包含不安全代碼的 demo.cs 程序的命令如下所示:

csc /unsafe demo.cs

csc -unsafe demo.cs

如果您使用的是 Visual Studio,那么您需要在項目屬性中啟用不安全代碼,具體步驟如下:

  • 通過雙擊資源管理器(Solution Explorer)中的屬性(properties)節(jié)點,打開項目屬性(project properties);
  • 點擊 Build 標簽頁;
  • 選擇選項“Allow unsafe code”。

 到此這篇關于C#指針變量與unsafe的實現(xiàn)的文章就介紹到這了,更多相關C#指針變量與unsafe內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • c#測試本機sql運算速度的代碼示例分享

    c#測試本機sql運算速度的代碼示例分享

    本文代碼目的很簡單,就是使用c#測試一下本機sql運算的速度,使用循環(huán)往數(shù)據(jù)里大量插入數(shù)據(jù),計算所用時間,大家參考使用吧
    2014-01-01
  • C#獲取目錄最后訪問時間的方法

    C#獲取目錄最后訪問時間的方法

    這篇文章主要介紹了C#獲取目錄最后訪問時間的方法,涉及C#中LastAccessTime方法的使用技巧,需要的朋友可以參考下
    2015-04-04
  • c# 在windows服務中 使用定時器實例代碼

    c# 在windows服務中 使用定時器實例代碼

    這篇文章主要介紹了c# 在windows服務中 使用定時器實例代碼,有需要的朋友可以參考一下
    2013-12-12
  • 最新評論