浅谈C#指针

之前很少听说指针,也不知道是做什么的。今天看了下书,正好见到了指针,就我现在的理解来谈一谈。

1.什么是指针。

    指针就是栈里面指向值存储的位置,也就值地址。

2.为什么要使用指正?

    在调用windows api方法(windows api是什么,我前面的博客有写到一些操作windows的一些代码,如:调节音量,亮度等等,都是调用windows api)和c++语言编译的dll时,可能需要将指针作为参数传递。在C#中使用指针可以提高程序的性能。

3.怎么创建指针

    指针在c# .net中是默认不安全代码,创建指针需要将程序设置为允许运行非安全代码,指针的关键字是unsafe。而且指针只能声明值类型 uint,int,byte,struct等。声明成功后的指针为非托管类型,也就是垃圾回收器不能处理他们。

4.为什么指针不能声明引用类型?

     因为引用类型的地址,会由于垃圾回收期的回收和压缩经常变化,所以指针所指向的地址可能不是最初的引用类型的值。

5.类成员的指针

    4上面说了,引用类型无法声明指针,但是有很多情况下,需要把类里面的值类型的成员声明成指针。

class myclass
{
 public long x;
 public long y;
}

var myobj=new myclass();
long* pl=&(myobj.x);
//这种写法是会报错的,因为指针声明了引用类型的成员

在这种情况下要如何实现呢?上面也说了,不能声明引用类型的原因是因为引用类型的地址是经常变化的,那我们只需要把他的地址固定就可以了

var myobj=new mycalss();
fixed(long* pl=&(myobj.x))
{
    XXXX
}

使用fixed关键字,在fixed的花括号执行完之前,垃圾回收器是不会移动myobj对象的。

虽然使用fixed关键字可以解决声明类类型里面的值类型,但是因为堆里面的地址不能移动,所以堆里面就会有很多零散的内存,这样对性能会有影响,所以fixed使用的时间越短越好

6.提高程序的性能。

前面说了使用指针的原因其中之一是可以提高性能。怎么提高呢?

比如说现在要创建一个int(值类型)的数组。一般是int[] data=new int[10],这样创建,数组是保存在堆里面,大家都知道,栈的运行速度比堆快,那么我们把int(值类型)数组存到栈里面就会提高性能。这里就需要用到指针和stackalloc关键字。

int* pl=stackalloc int[10]

在这里只会给数组在栈里面分配内存,不会默认初始化任何值。

给数组赋值: pl[0]=1;//给数组的第一个位置赋值data[0]=1

pl[1]=2;//给数组的第二个位置赋值data[1]=2;

注意!!!!!

pl[20]=100; 这里是不会报错的,如果声明在引用类型这里会报错:下标越界,但是如果是指针这里就不会报错,

pl[20]这个地方是超过了我们之前所分配的区域,现在无法知道这个地方是否有值等等,反正在这个地址的地方被赋值了20.

所以!!!!!使用指针的时候最好是明白自己是在做什么,因为操作失误可能会出现一些古怪的异常

 

在一般的程序中不推荐使用指针,容易报错。反正我个小菜鸟是不会用的,嘿嘿

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值