c#指针

2018-11-30  本文已影响11人  平凡的鱼仔

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

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
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
上一篇下一篇

猜你喜欢

热点阅读