C#查看各种变量的指针地址
将项目的“可编译不安全代码”属性设置为true就可以了,方法如下:项目属性对话框->配置属性->生成->允许不安全代码块
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | namespace Pointer { struct XYZ { public int a; public int b; public int c; bool b1; }; class Program { //静态变量存储在堆上,查看指针时需用fixed固定 static int m_sZ = 100; //普通数据成员,也是放在堆上了,查看指针时需用fixed固定 int m_nData = 100; //等价于C/C++的 #define 语句,不分配内存 const int PI = 31415; //unsafe可以放在Main函数声明中!! static unsafe void Main( string [] args) { //简单的结构变量放在栈上,无需fixed XYZ stData = new XYZ(); stData.a = 100; Console.WriteLine( "结构变量= 0x{0:x}" , ( int )&stData); //数组变量的声明放在了栈上,数据放在了堆上,需用fixed固定 int [] arry = null ; arry = new int [10]; fixed ( int * p = arry) { Console.WriteLine( "array = 0x{0:x}" , ( int )p); } //这些放在栈上的变量,可以直接使用指针指向 //从打印的指针的数据看,int是4字节的,double是8字节的 int y = 10; int z = 100; double f = 0.90; Console.WriteLine( "本地变量y = 0x{0:X}, z = 0x{1:X}" , ( int )&y, ( int )&z); Console.WriteLine( "本地变量f = 0x{0:X}" , ( int )&f); //下面失败 //fixed (int* p = &P.PI) //{ //} //放在堆里面的数据的地址,就必须用fixed语句! string ss = "Helo" ; fixed ( char * p = ss) { Console.WriteLine( "字符串地址= 0x{0:x}" , ( int )p); } Program P = new Program(); //这个是类对象,放在堆里面 fixed ( int * p = &P.m_nData) { Console.WriteLine( "普通类成员变量 = 0x{0:X}" , ( int )p); } //静态成员变量在堆上 fixed ( int * p = &m_sZ) { Console.WriteLine( "静态成员变量 = 0x{0:X}" , ( int )p); } //下面是每种类型的占用字节个数 Console.Write( "\n\n下面是每种类型的占用字节个数\n" ); Console.WriteLine( "sizeof(void *) = {0}" , sizeof ( void *)); Console.WriteLine( "sizeof(int) = {0}, * = {1}" , sizeof ( int ), sizeof ( int *)); //4 Console.WriteLine( "sizeof(long) = {0}, * = {1}" , sizeof ( long ), sizeof ( long *)); //8 Console.WriteLine( "sizeof(byte) = {0}, * = {1}" , sizeof ( byte ), sizeof ( byte *)); //1 Console.WriteLine( "sizeof(bool) = {0}, * = {1}" , sizeof ( bool ), sizeof ( bool *)); //1 Console.WriteLine( "sizeof(float) = {0}, * = {1}" , sizeof ( float ), sizeof ( float *)); //4 Console.WriteLine( "sizeof(double) = {0}, * = {1}" , sizeof ( double ), sizeof ( double *)); //8 Console.WriteLine( "sizeof(decimal) = {0}, * = {1}" , sizeof ( decimal ), sizeof ( decimal *)); //16 Console.WriteLine( "sizeof(char) = {0}, * = {1}" , sizeof ( char ), sizeof ( char *)); // Console.WriteLine( "sizeof(XYZ) = {0}, * = {1}" , sizeof (XYZ), sizeof (XYZ*)); // //Console.WriteLine("sizeof(object) = {0}, * = {1}", sizeof(object), sizeof(object*));//16 //Console.WriteLine("sizeof(C) = {0}, * = {1}", sizeof(C), sizeof(C*));//16 Console.ReadKey(); } } } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!