在C#中使用指针

最近同事在问关于C#底层代码有指针的问题,具体想知道怎么在c#中使用指针。指针在C++中比较常见,指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址,指针使用了需要释放,否则会有内存泄漏的风险,所以C#中分配使用内存托管GC,自动释放完成的内存资源,这样避免了C++的风险,减轻了程序员的负担。如果在C#底层开发使用托管代码无法完成的工作可以使用指针吗?答案是肯定的,本篇文章讲述如果在C#使用指针,主要的开发工具是Visual Studio 2022。.

一、环境配置

    默认情况下,Visual Studio不让使用非托管代码,这就需要进行特殊处理,首先需要设置项目"属性->生成->常规"下的"不安全代码"打勾"允许使用“unsafe”关机键字编译代码。"如下图

在C#中使用指针

使用不安全代码语法

   使用时在代码块和方法前面加上unsafe关键字,因为crl不会检测unsafe关键字下的安全,直接执行代码,表明可以使用非托管代码。

       //方法        private static unsafe void Main(string[] args)        {        }         unsafe        {            //代码块        }

二、指针的使用

    在C#中,指针只能使用在sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal, bool,struct(结构体),结构体中只能包括非托管类型中。引用类型不能使用指针。

整形和字符指针的使用

int num = 8;int* ipnum = #    //将num的地址赋值给ipnumConsole.WriteLine((int)&ipnum);  //取ipnum的地址Console.WriteLine(*ipnum);     //取ipnum指向的值
 char str = 'a'; char* ipstr = &str;    //将str的地址赋值给ipstr Console.WriteLine((int)&ipstr);  //取ipstr的地址 Console.WriteLine(*ipstr);     //取ipstr指向的值

结构体使用指针

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

指针与参数

  public static unsafe char* getchar(char* c) {     char ptr = *c;     return &ptr; } //调用char c = 'a';Console.WriteLine(*getchar(&c));

三、指针的定义和操作符

指针的定义语法:
int* p 整形指针
int** p 指向整形指针的指针
char* c 指向字符的指针
int*[] arr 整形一维数组指针
 
指针的操作符:
* 取值运算符
& 取址运算符
-> 通过指针处理结构体中的数据(获取或赋值)
++与– 指针增、减操作
fixed 用户暂时固定托管代码中引用类型的位置。
Stackallc 分配内存

​​​​

//例如分配内存char* cpstr = stackalloc char[20];
结语

     本文简单介绍了指针的使用,更多使用可以参考微软官网,比如指针与类的使用,大家感兴趣可以研究一下。C#使用指针不是很方便,如果学习指针还是建议大家用c++,.NET框架也不推荐使用指针,指针的使用仅供学习,如果很底层开发建议用C++。关于c#指针欢迎留言讨论。