最近同事在问关于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的地址赋值给ipnum
Console.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#指针欢迎留言讨论。
版权声明:本文来源于网友收集或网友提供,仅供学习交流之用,如果有侵权,请转告版主或者留言,本公众号立即删除。