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

推荐订阅源

T
The Blog of Author Tim Ferriss
S
Securelist
D
Docker
The Register - Security
The Register - Security
GbyAI
GbyAI
Recorded Future
Recorded Future
Engineering at Meta
Engineering at Meta
Stack Overflow Blog
Stack Overflow Blog
云风的 BLOG
云风的 BLOG
P
Proofpoint News Feed
罗磊的独立博客
博客园 - 【当耐特】
F
Full Disclosure
WordPress大学
WordPress大学
腾讯CDC
小众软件
小众软件
大猫的无限游戏
大猫的无限游戏
D
DataBreaches.Net
SecWiki News
SecWiki News
L
Lohrmann on Cybersecurity
I
InfoQ
MyScale Blog
MyScale Blog
量子位
Cyberwarzone
Cyberwarzone
博客园 - 三生石上(FineUI控件)
The Hacker News
The Hacker News
F
Fortinet All Blogs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Jina AI
Jina AI
博客园_首页
H
Help Net Security
K
Kaspersky official blog
酷 壳 – CoolShell
酷 壳 – CoolShell
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Webroot Blog
Webroot Blog
Blog — PlanetScale
Blog — PlanetScale
V
Vulnerabilities – Threatpost
Y
Y Combinator Blog
The Cloudflare Blog
P
Proofpoint News Feed
V
Visual Studio Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
T
Tailwind CSS Blog
爱范儿
爱范儿
P
Privacy International News Feed
Security Archives - TechRepublic
Security Archives - TechRepublic
The GitHub Blog
The GitHub Blog
C
Cybersecurity and Infrastructure Security Agency CISA
B
Blog RSS Feed

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