c#指针

作者: 平凡的鱼仔 | 来源:发表于2018-11-30 12:13 被阅读11次

     刚开始我以为c#没有指针,后来才发现c#是可以使用指针的,但前提是使用了unsafe声明。不过更多的情况下还是用delegate委托来代替指针,使用指针会导致线程不安全。下面是几个简单的例子:

    • 例一:将方法声明为unsafe
    namespace UnsafeMethodApp
    {
        class Program
        {
            //将使用了指针的方法声明为unsafe
            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();
            }
        }
    }
    

    vs2012运行结果:


    UnsafeMethodApp.PNG
    • 例二:将代码块声明为unsafe
    namespace UnsafeCodeApp
    {
        class Program
        {
            public static void Main(string[] args)
            {
                //将使用了指针的代码块声明为unsafe,这样使用了指针的方法(函数)就不需要声明为unsafe了
                unsafe
                {
                    int var = 10;
                    int* p = &var;
                    Console.WriteLine("var:{0}", var);
                    //可以使用 ToString() 方法检索存储在指针变量所引用位置的数据
                    Console.WriteLine("var:{0}", p->ToString());
                    Console.WriteLine("Address:{0}", (int)p);
                }
                Console.ReadKey();
            }
        }
    }
    

    vs2012运行结果:


    UnsafeCodeApp.PNG
    • 例三:指针与数组结合使用
    namespace PointerArrayApp
    {
        class Program
        {
            public static unsafe void Main(string[] args)
            {
                int[] list = { 10, 200, 3000 };
                //使用指针访问数组,得先使用关键字fixed固定指针,这样我们就可以像c/c++那样使用指针了
                fixed(int* p = list) 
                for (int i = 0; i < 3; i++)
                {
                    Console.WriteLine("Address of list[{0}]:{1}", i, (int)(p + i));
                    Console.WriteLine("Value of list[{0}]:{1}", i, *(p + i));
                }
                Console.ReadKey();
            }
        }
    }
    

    vs2012运行结果:


    PointerArrayApp.PNG
    • 例四:使用指针作为函数参数
    namespace PointerAsParaApp
    {
        class Program
        {
            public unsafe void swap(int* a, int* b)
            {
                int temp = *a;
                *a = *b;
                *b = temp;
            }
    
            static unsafe void Main(string[] args)
            {
                Program pObj = new Program();
                int var1 = 10;
                int var2 = 20;
                int* x = &var1;
                int* y = &var2;
    
                Console.WriteLine("Before swap,var1:{0},var2:{1}", var1, var2);
                pObj.swap(x, y);
                Console.WriteLine("Before swap,var1:{0},var2:{1}", var1, var2);
                Console.ReadKey();
            }
        }
    }
    

    vs2012运行结果:


    PointerAsParaApp.PNG

    相关文章

      网友评论

          本文标题:c#指针

          本文链接:https://www.haomeiwen.com/subject/fbmccqtx.html