zoukankan      html  css  js  c++  java
  • C#中指针使用总结

    C#中指针使用总结

    int*[] arr 整形一维数组指针

    五、指针的使用

    1.整形指针的使用

    int i=10;
    int* iptr = &i;    //将i的地址赋值给iptr
    Console.WriteLine((int)&iptr);  //取iptr得地址
    Console.WriteLine(*iptr);     //取iptr指向的值

    2.结构体指针

    复制代码
    struct Location
    {
        public int X;
        public int Y;
    }
    unsafe static void Main(string[] args)
    {
        Location location;
        location.X = 10;
        location.Y = 5;
        Location* lptr = &location;
        Console.WriteLine(string.Format("location 地址{0},lptr地址{1},lptr值{2}",(int)&location,(int)lptr,*lptr));
        Console.WriteLine(string.Format("location.x的地址{0},location.x的值{1}",(int)&(lptr->X),lptr->X));
        Console.WriteLine(string.Format("location.y的地址{0},location.y的值{1}", (int)&(lptr->Y), lptr->Y));
     }
    复制代码

    以上代码输出结构体的地址和值。我们在操作地址时,可以直接看到结构体的内存分配。

    3.指针与参数

    复制代码
    public static unsafe int* Add(int* x,int* y)
    {
        int sum = *x + *y;
        return ∑
    }
    
    int i = 2, j = 3;
    Console.WriteLine(*Add(&i,&j));
    复制代码

    4.类与指针,因为类是托管类型,我们知道类受到“垃圾收集”的影响,它的内存地址是不固定的。而且类是引用类型,是不能声明为指针类型的。而指针分配内存后,不受“垃圾收集”影响,地址是固定的。所以为了使用类中的数据,我们需要临时固定类的地址。这就用到fixed关键词,用fixed后,就可以操作类中的值类型了。

    复制代码
    class People
    {
        public int Age;   //值类型,不可以是属性
        public void ShowAge()
        {
            Console.WriteLine(Age);
        }
    }
    
    
    People people = new People();
    people.Age = 10;
    fixed(int* agePtr=&people.Age)
    {
        *agePtr += 1;
    }
    people.ShowAge();  //11
    复制代码

    通过以上的方法,我们可以操作值类型,也可以获得值类型的地址。但如何获取类的内存地址?我们可以使用GCHandle,来自System.Runtime.InteropServices命名空间。GCHandle提供从非托管内存访问托管对象的方法。如下:

    object p = new People();
    GCHandle h = GCHandle.Alloc(p, GCHandleType.Pinned);
    IntPtr addr = h.AddrOfPinnedObject(); 
    Console.WriteLine(addr.ToString());
    h.Free();

    六、C#中使用指针的总结

    1.引用类型不能定义为指针
    2.msdn上说enum可以定义为指针,可是我真不知道它的用处是什么。所以在指针的类型中并没有出现enum类型。
    3.c#中的指针操作远远不如c/c++,如果想学习指针的话,还是用c/c++
    4.微软并不推荐使用unsafe code模式,也不推荐使用指针。在msdn官方文档中,唯一一句赞美C#指针的话就是“合理的使用指针,可以提高程序的执行速度”。但是什么是“合理的使用”?我下载了msdn上的几个关于C#指针的实例代码,发现用的最多的是调用api函数,在api函数中,有大量的指针参数。
    5.fixed的使用可能产生存储碎片,因为它们不能移动。如果确实需要固定对象,固定对象的时间应该越短越好。
    6.可以使我们了解非托管类型的内存分配。

     
     
    分类: C#
  • 相关阅读:
    用OKR让你的员工嗨起来
    用数据让我们的OKR变得“冷酷”却更有价值
    好的想法只是OKR的开始创业者谨记
    “OKR播种机”JOHN DOERR–目标是对抗纷乱思绪的一针疫苗
    用OKR提升员工的执行力
    OKR的两个基本原则
    《OKR工作法》| 一次说太多等于什么都没说
    《OKR工作法》–让所有人承担自己的职责
    《OKR工作法》——打造一支专一的团队
    Oracle wm_concat()函数的实际运用
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3203687.html
Copyright © 2011-2022 走看看