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#指针

     刚开始我以为c#没有指针,后来才发现c#是可以使用指针的,但前提是使用了unsafe声明。不过更多的情况下还是用...

  • C#指针

    指针基础 指针可以完成对内存地址的操作指针就是用来存储某个变量的内存地址 这时候输出pa就是输出a的内存地址 这时...

  • 面经——指针和引用的区别

    为什么使用指针 每一个编程语言都使用指针C++将指针暴露给程序员,而Java和c#将指针隐藏起来。 使用指针的优点...

  • C++ 、java 和 C# 的区别

    一、基础类型 c++: ** java:** C#: 二、指针 1.java 是没有指针这个概念,c++ 和 c#...

  • python代码之间的“通信”

    C、C++中有指针C#中有委托python中,怎么弄

  • C# 委托

    C#委托 C#中的委托(Delegate)类似于C或C++中函数的指针。委托(Delegate)是存有对某个方法的...

  • C#魔灵-lesson_03-数据类型

    C#中的数据类型分为以下几种 值类型(Value types) 引用类型(Reference types) 指针类...

  • C#里面的指针

    先贴代码 实现的是一个复制的功能 注意出现的错误警告 如果你在编译过程中出现了错误CS0227不安全代码只会在使用...

  • C#日记——委托

    很多人说C#和JAVA很像,但也有很多地方不同,委托就是一个C#特有的东西委托可以理解为C语言里的函数指针,只要参...

  • C#中的引用

    今天面试的时候被问到C#中的引用,因为在这之前讨论的是C++的指针和引用,所以当时下意识的以为面试官想考察C#中修...

网友评论

      本文标题:c#指针

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