当前位置: 欣欣网 > 码农

在C#中使用指针

2024-02-05码农

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

一、环境配置

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

使用不安全代码语法

使用时在代码块和方法前面加上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{publicint X;publicint Y;}staticunsafevoidMain(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));}

指针与参数

publicstaticunsafechar* 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 = stackallocchar[20];

结语

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

版权声明:本文来源于网友收集或网友提供,仅供学习交流之用,如果有侵权,请转告版主或者留言,本公众号立即删除。