最近在学数据类型,关值类型和引用类型我是这样认为的,大家看看有没有什么问题 !
比如这样一个程序:
 void Main (string[]ss)
{
    int a=10;
    char b='b';
    int[] arr=new int[5];
}
像值类型 a b 在线程栈中 就分别分配一个 4个字节(32位)的内存地址给a , 然后分配一个字节的栈内存给 b。像引用类型的arr 在托管堆中, 分配一个5*4个字节的堆内存给arr, 然后再栈中存储这个5*4个字节的堆内存的引用 也就是地址不知道我上面说的2句话对不对? 如果都是对的,像int这样的值类型,栈给了他4个字节来保存,那引用类型的地址在栈中是用多大的空间来保存的呢?保存的是不是十六进制表示的内存地址?

解决方案 »

  1.   

    int[] arr=new int[5];
    这里有2个。
    arr 是一个对象的引用
    new int[5] 是长度为5*4的数组
    数组应该是在堆上,arr不知道,不确定。按理说引用类型都是放在堆上,当没有使用的时候,被垃圾回收。
      

  2.   

                unsafe
                {
                    Console.WriteLine(sizeof(int));
                    Console.WriteLine(sizeof(char));
                    Console.WriteLine(sizeof(byte));
                }
    输出 4 2 1
    原来char是两个字节的。
    引用类型的空间,用sizeof好像不行。用惯了c/c++感觉c#在这种地方很不方便,不过从另一个方面来说就是C#不必关心这种问题。
      

  3.   

    查了一下,char是16位的unicode字符,所以是2字节
      

  4.   

    sizeof(char *)的结果是4,所以指针是4字节的,换句话说地址是4字节的。
    既然引用也是一种地址,那应该也是4字节吧,不过我不知道怎么验证。
      

  5.   

    int[] arr=new int[5];
    //在堆中申请数组空间,在栈中申请引用变量arr的空间
      

  6.   

    指针变量所占内存大小  根据不同机器 有所不同int[] arr=new int[5];
    arr在栈上
    如果int占4 byte,那么 堆上还有 4*5 byte ,arr的等于 4*5 这块内存的首地址编号
    PS:以上套用C中的理解C#中不太关注变量内存占用情况不知对否 呵呵
      

  7.   

     int[] arr=new int[5];
    应该是5*4的空间放在堆中,arr保存数组首地址。arr的数据存储是在栈中,数组对象是在堆中
    我以前做的一张教学ppt