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

推荐订阅源

N
Netflix TechBlog - Medium
V
Vulnerabilities – Threatpost
Google Online Security Blog
Google Online Security Blog
Hugging Face - Blog
Hugging Face - Blog
L
LINUX DO - 热门话题
云风的 BLOG
云风的 BLOG
P
Proofpoint News Feed
D
Docker
C
Cyber Attacks, Cyber Crime and Cyber Security
MyScale Blog
MyScale Blog
P
Palo Alto Networks Blog
T
Tenable Blog
P
Privacy International News Feed
Google DeepMind News
Google DeepMind News
小众软件
小众软件
Cisco Talos Blog
Cisco Talos Blog
aimingoo的专栏
aimingoo的专栏
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
A
Arctic Wolf
C
Cybersecurity and Infrastructure Security Agency CISA
C
Cisco Blogs
T
Threat Research - Cisco Blogs
NISL@THU
NISL@THU
The Hacker News
The Hacker News
Project Zero
Project Zero
AWS News Blog
AWS News Blog
Simon Willison's Weblog
Simon Willison's Weblog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
T
Threatpost
V
Visual Studio Blog
The GitHub Blog
The GitHub Blog
The Cloudflare Blog
Last Week in AI
Last Week in AI
Jina AI
Jina AI
Cyberwarzone
Cyberwarzone
The Register - Security
The Register - Security
C
CXSECURITY Database RSS Feed - CXSecurity.com
Vercel News
Vercel News
D
Darknet – Hacking Tools, Hacker News & Cyber Security
MongoDB | Blog
MongoDB | Blog
U
Unit 42
Scott Helme
Scott Helme
A
About on SuperTechFans
WordPress大学
WordPress大学
F
Fortinet All Blogs
大猫的无限游戏
大猫的无限游戏
G
GRAHAM CLULEY
Latest news
Latest news
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
S
Schneier on Security

博客园 - 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] 有点烦索