


























// 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] 有点烦索
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。