首页 文章详情

在C#中使用指针

DotNet NB | 122 2022-06-24 14:26 0 0 0
UniSMS (合一短信)

     最近同事在问关于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{    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#指针欢迎留言讨论。

推荐阅读:
  API 工程化分享
  我的微软 MVP 之路
【译】ASP.NET Core 6 中的性能改进
【译】.NET 7 预览版 1 中的 ASP.NET Core 更新
【译】C# 11 特性的早期预览

点击下方卡片关注DotNet NB

一起交流学习

▲ 点击上方卡片关注DotNet NB,一起交流学习

请在公众号后台

回复 【路线图】获取.NET 2021开发者路线图
回复 【原创内容】获取公众号原创内容
回复 【峰会视频】获取.NET Conf开发者大会视频
回复 【个人简介】获取作者个人简介
回复 【年终总结】获取作者年终总结
回复 加群加入DotNet NB 交流学习群

长按识别下方二维码,或点击阅读原文。和我一起,交流学习,分享心得。


good-icon 0
favorite-icon 0
收藏
回复数量: 0
    暂无评论~~
    Ctrl+Enter