随笔 - 73  文章 - 1  评论 - 16  阅读 - 79654

C# 指针用法小结

复制代码
 
// C# pointer
unsafe void PointerUse(){
  int i=0;
  var pi=&i;  // 这是ok的
  Console.WriteLine("i={0}",i);
  pi[0] += 1;
  Console.WriteLine("i={0}",i);
  var x1=new object();
  var px1=&x1; // warn:CS8500
  Span<int> x2=[1,2,3];
  var px2=&x2;
  Span<int> x3=*px2;
  Console.WriteLine("px2[0]={0}",(*px2)[0]);
  (*px2)[0]+=100;
  Console.WriteLine("px2[0]={0}",(*px2)[0]);
  fixed(int* p=x2){
    p[0]+=100;
    p[2]+=5;
    // var p2=p+1;//指针+ - 数字还是指针
    // var p2=p+sizeof(int);
    var p2=p+1;
    // Console.WriteLine("p2:{0}",p2);
    *p2+=3;
    nint p3=(nint)p+sizeof(int);
    *(int*)p3-=1;
    ((int*)p3)[0]-=1;
    Console.WriteLine("p2:{0},x2:{1}",*p2,string.Join(",",x2.ToArray()));
  }
  Console.WriteLine("px2 convert to nint value:{0}",(nint)px2);
  Console.WriteLine("px2 convert to nuint value:{0}",(nuint)px2);
  //
  var x4=new int[]{1,2,3};
  int[]* px4=&x4;
  Console.WriteLine("px4[0][0]:{0}",px4[0][0]+=3);
  Console.WriteLine("px4[0][0]:{0}",px4[0][1]+=3);
  Console.WriteLine("px4[0][0]:{0}",px4[0][2]+=3);
  fixed( int* px4_1=&x4[0]){
  Console.WriteLine("px4_1[0]:{0}",px4_1[0]);
  Console.WriteLine("px4_1[1]:{0}",px4_1[1]);
  Console.WriteLine("px4_1[2]:{0}",px4_1[2]);
  }
  Console.WriteLine("*px4[0]:{0}",(*px4)[0]);
  Console.WriteLine("*px4[1]:{0}",(*px4)[1]);
  Console.WriteLine("*px4[2]:{0}",(*px4)[2]);
  Console.WriteLine("x4:{0}",string.Join(",",x4.ToArray()));
  (*px4)[0]+=1;
  Console.WriteLine("x4:{0}",string.Join(",",x4.ToArray()));
}

复制代码

i=0
i=1
px2[0]=1
px2[0]=101
p2:3,x2:201,3,8
px2 convert to nint value:176251454976
px2 convert to nuint value:176251454976
px4[0][0]:4
px4[0][0]:5
px4[0][0]:6
px4_1[0]:4
px4_1[1]:5
px4_1[2]:6
*px4[0]:4
*px4[1]:5
*px4[2]:6
x4:4,5,6
x4:5,5,6

C#指针又学到两个新东西,注意避坑,分享 ,1: *t 和 t[0] 等价; 2: fixed 里 p[0]  == fixed 外的 p[0][0]亦即(*p)[0] ;fixed(T* p=arr)   外面只能写成 T*p=&arr;  3:  T* p;  p+=1 ; 相当于 (nint)p+=sizeof(T);  4: 对于通过nint/nuint来进行指针赋值的时候要这样写 "*(T*)nintValue " 这种写法可以赋值也可以取值

 

C# 指针冷知识: 1,T* p = &arr;  在fixed(T* p= arr){/*...*}  ;  2, *p 也可以写成 p[0]; 3, 与 nint/nuint 互相转换, p+=1; 相当于 (nint)p+=sizeof(T);

 

var p=new int[]{1,2,3}  ;  相当于  int[]* p=new int[]{1,2,3};  在fixed外,不能够 int* p=arr[0]; 要在fixed里面; 而 C#的 malloc 是 NativeMemory.Alloc(n); 从这里可以直接返回一个 void* 可以转成 任务指针, 象基础byte* 所以  byte* p 可以直接 p[i] 进行愉快的运算,而 若是 在 T[]* p 的话 需要先  p[0] 或 *p  再 索引 就是 p[0][i]  或(*p)[i] 有点烦索

posted on   ProjectDD  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示