惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Hugging Face - Blog
Hugging Face - Blog
Vercel News
Vercel News
C
Check Point Blog
G
Google Developers Blog
博客园 - 司徒正美
量子位
Engineering at Meta
Engineering at Meta
S
SegmentFault 最新的问题
Google DeepMind News
Google DeepMind News
F
Fortinet All Blogs
A
About on SuperTechFans
美团技术团队
D
DataBreaches.Net
Stack Overflow Blog
Stack Overflow Blog
Jina AI
Jina AI
Y
Y Combinator Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Apple Machine Learning Research
Apple Machine Learning Research
J
Java Code Geeks
MongoDB | Blog
MongoDB | Blog
人人都是产品经理
人人都是产品经理
H
Hackread – Cybersecurity News, Data Breaches, AI and More
The Cloudflare Blog
U
Unit 42

博客园 - ProjectDD

NET 中 Async/Await 的演进:从状态机到运行时优化的 Continuation C# BinaryPrimitives 类 C# 内存对齐 linq 查询关于 from子句 关于C# await的一点新理解 关于排序算法 C# Dev Kit 经常导致崩溃 不太会用Span<T> 看文档上的优点估摸着试试 span,memory,ArrayPool,MemoryPool,等的性能对比 C# simd 性能雷点记录 C# 模式匹配里应该注意的几点 高中生理解梯度为何是方向导数极大值 概略 deep net 通过relu 进行函数逼近 win10 下安装 rust 的 依赖配置,通过vs2022 C# 有多需要aot 24个希腊字母的中文拼音版 英语发音探讨 sagemath 9.x 下的 jupyter 工作路径设置 Serializing delegates is not supported on this platform
C# 指针用法小结
ProjectDD · 2024-11-21 · via 博客园 - ProjectDD

// 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] 有点烦索