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();
        }
    
}

  

posted @   随心~  阅读(3960)  评论(0编辑  收藏  举报
编辑推荐:
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
阅读排行:
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!

点击右上角即可分享
微信分享提示