C#中的不安全代码(关键字unsafe)和固定指针(关键字fixed)

首先先设置一下:

鼠标右键点工程,选择生成,勾选上允许不安全代码。
在这里插入图片描述

解释一下什么是不安全代码:

C#是一门托管语言,可以不用自己去管理内存。有一些机制的出现代替了C/C++中的指针,如引用、托管、事件等机制。但是C#并没有像java一样完全抛弃掉指针,所以在C#下还可以用指针的。当一个代码块使用unsafe修饰标记符时,C#允许在函数中使用指针变量。不安全代码或非托管代码是指使用变量的代码块。

用unsafe关键字编写不安全代码

因为使用指针会带来相关的风险,所以C#只允许在特别标记的代码块中使用指针。标记代码所用的关键字是unsafe。下面代码把一个方法标记为unsafe:

   unsafe int GetSomeNumber()
    {
    
    
        //code that can use pointers
    }

具体例子:

例子1:

using System;

namespace UnsafeCodeApplication
{
    
    
    class Program
    {
    
    
        static unsafe void Main(string[] args)
        {
    
    
            int var = 20;
            int* p = &var;
            Console.WriteLine("Data is :{0}", var);
            Console.WriteLine("Address is:{0}", (int)p);
            Console.ReadKey();
            
        }
    }


}

运行结果:
在这里插入图片描述
例子2:

/*使用指针检索数据值*/
using System;
namespace UnsafeCodeApplication
{
    
    
    class Progarm
    {
    
    
        public static void Main()
        {
    
    
            unsafe
            {
    
    
                int var = 20;
                int* p = &var;
                Console.WriteLine("Data is:{0}", var);
                Console.WriteLine("Data is:{0}", p->ToString());
                Console.WriteLine("Address is:{0}", (int)p);  //(int)p取得到p的地址
            }
            Console.ReadKey();
        }
    }
}

运行结果:
在这里插入图片描述
例子3:

using System;
namespace UnsafeCodeApplication
{
    
    
    class TestPointer
    {
    
    
        public unsafe void swap(int* p, int* q)
        {
    
    
            int temp = *p;
            *p = *q;
            *q = temp;
        }

        public unsafe static void Main()
        {
    
    
            TestPointer p = new TestPointer();
            int var1 = 10;
            int var2 = 20;
            int* x = &var1;
            int* y = &var2;

            Console.WriteLine("Before Swap: var1:{0}, var2{1}", var1, var2);
            p.swap(x, y);

            Console.WriteLine("After Swap: var1:{0}, var2{1}", var1, var2);
            Console.ReadKey();
        }
    }
}

运行结果:
在这里插入图片描述

例子4:

/*使用指针访问数组元素*/
using System;
namespace UnsafeCodeApplication
{
    
    
    class TestPointer
    {
    
    
        public unsafe static void Main()
        {
    
    
            int[] list = {
    
     10, 100, 1000 };
            //因为int* ptr 和int[]list是不同类型的,
            //指针ptr在内存中是不固定
            //而数组地址是固定的
            //所以要用fixed关键字来固定指针
            fixed(int* ptr = list)   //固定指针
                for(int i = 0; i<3; i++)
                {
    
    
                    Console.WriteLine("Address of list[{0}] = {1}", i, (int)(ptr + i));
                    Console.WriteLine("value of list[{0}] = {1}", i, *(ptr + i));
                }
            Console.ReadKey();

        }
    }
}

运行结果:
在这里插入图片描述

Guess you like

Origin blog.csdn.net/weixin_50188452/article/details/114961276