C#查看各种变量的指针地址

将项目的“可编译不安全代码”属性设置为true就可以了,方法如下:项目属性对话框->配置属性->生成->允许不安全代码块

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

  

时间: 2024-10-13 03:10:51

C#查看各种变量的指针地址的相关文章

深入研究:对变量以及指针重新赋值过程中原本的地址是否会改变。(按值传递机制的深入)

在研究按值传递机制时,发现一些模糊的概念.就是在对一个原本的(指针)变量重新给定另外一个值时,会不会改变这个变量原本所在的内存位置(即地址).因此,决定深入研究一下.而且这也是必要的. 给一个变量重新赋值时,地址的变化 1 //验证变量在被赋值(以及被重赋值)时原本分配的内存地址是否会改变. 2 3 #include <stdio.h> 4 5 int main(void) 6 { 7 int a;//声明a,即已经给a分配一个内存地址 8 printf("声明a时的地址:%p\n&

go之变量、指针、引用地址

一.值类型 定义和说明 定义:变量直接指向存在内存中的值,我们称之为值类型. 值类型的变量的值存储在栈中. 值类型 将一个变量赋值给另一个变量 被称为值拷贝 实例 package main import "fmt" func main(){ var num1,num2 int num1 = 10 num2 = num1 // 值类型赋值操作 fmt.Println(num1,num2) // 10 10 num1 = 20 fmt.Println(num1,num2) // 20 10

指针的含义——指针变量、指针的指针、指针使用的注意

指针其实很容易理解的,其他并不是大家想象的那么神奇,那么难. 一.指针的含义:指针其实就是一个变量,它所存放的不是数据,而是数据在内存中地址.当然指针也可以存放函数(方法)的地址,后面会讲到的.声明指针的关键符是*号,指向地址的关键符是&. 二.指针变量: 例如1:#include <stdio.h> int main {  int a =10;   //第一一个变量a,赋值为10 int *p = &a;   //p就是一个指针变量,所指向的就是变量a的地址 printf(&

辨析函数指针变量和指针型函数

在上一篇随笔(顺序表基本操作算法的代码实现)中,LocateElem()函数的第三个形参的形式是: Status (*compare)(Elemtype e,Elemtype temp); 这是一个函数指针变量,借此机会记录一下函数指针变量和指针型函数的区别. 一.写法上的区别 函数指针变量 指针型函数 int (*function)(int i); int  *function(int i){} 上面是一个例子,可看到函数指针变量只是在:*function处比指针型函数多了一对小括号,下面是两

数组变量和指针的关系

老师说数组变量可以被看作是const的指针变量,到底是"可以被看作",还是"就是"指针呢? 用程序证据来说明你的观点. (提示:如果对const指针的所有的操作都可以对数组变量做,而且结果一致,就说明数组变量就是指针:如果有某个操作不能做,或者结果不一致,就说明不是指针) #include <stdio.h> int main(){ int a[] = {1,1,2,3,4,5,6,7,8,9,0,}; int *const p = &a[0];

指向结构体变量的指针作函数参数

 /********************* * 指向结构体变量的指针作函数参数 * ***********************/ #include<stdio.h> #include<string.h> struct student {  int num;  char name[20];  //char *name;    //若定义为指针则应与下面 stu.name = "jacob"; 配对使用,交叉使用则会报错                 //

(转)const变量通过指针修改问题

程序笔试题-const变量通过指针修改问题 2012-10-06 20:45:18 分类: C/C++ const的变量在特定情况下可以通过指针修改,但是在另一些情况下是不能通过指针修改. 以下是VC6下才测试. 1 不能修改的情况 #include <stdio.h>int const a = 10;void main(void){ int *p = (int*)&a; *p = 20; printf("%d\n", *p);} 程序编译通过,但运行时错误: 指示

一起talk C栗子吧(第一百三十七回:C语言实例--查看环境变量)

各位看官们,大家好,上一回中咱们说的是exec系列函数的例子,这一回咱们说的例子是:查看环境变量.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在前面介绍exec系列函数时提到过程序的运行环境,有些看官可能不太明白,今天我们一起来看看程序运行环境中的环境变量.环境变量在实际编写程序的时候经常使用,比如常用的PATH环境变量.有时候程序无法运行,就是环境变量错误引起的. 环境变量是操作系统提供的一种参数,程序可以通过这些参数来在操作系统中运行,它是本质上是键值对序列. 例如:SH

Android For JNI(三)——C的指针,指针变量,指针常见错误,值传递,引用传递,返回多个值

Android For JNI(三)--C的指针,指针变量,指针常见错误,值传递,引用传递,返回多个值 C中比较难的这一块,大概就是指针了,所以大家还是多翻阅一下资料,当然,如果只是想了解一下,看本篇也就够了,不过我也尽量陈述的很详细 一.指针 要说指针,其实通俗易懂的话来说,他应该是保存内存地址的一个变量,我们来看一下小例子 #include <stdio.h> #include <stdlib.h> main(){ //int 变量 int i ; i = 5; //打印i的值