C#の安全でないコード(キーワードが安全ではない)と固定ポインター(キーワードが固定されている)

最初に設定します。

プロジェクトを右クリックし、[生成]を選択して、[安全でないコードを許可する]をオンにします。
ここに画像の説明を挿入

安全でないコードとは何かを説明します。

C#は管理言語であるため、メモリを自分で管理する必要はありません。参照、ホスティング、イベントなど、C / C ++のポインターを置き換えるメカニズムがいくつかあります。ただし、C#はJavaのようにポインターを完全に破棄しないため、ポインターはC#で引き続き使用できます。コードブロックで安全でない修飾子を使用する場合、C#では関数でポインター変数を使用できます。安全でないコードまたは管理されていないコードは、変数を使用するコードのブロックを指します。

安全でないコードを書くには、unsafeキーワードを使用します

ポインターの使用には関連するリスクが伴うため、C#では、特別にマークされたコードブロックでのみポインターを使用できます。コードをマークするために使用されるキーワードは安全ではありません。次のコードは、メソッドを安全でないものとしてマークします。

   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();

        }
    }
}

演算結果:
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_50188452/article/details/114961276