最近开始接触C#,遇到一些问题,麻烦指点下,先谢了
在C++中 byte *p=new byte[10],p是位于栈中的,具体存储位置在堆中
那么在C#中,byte[]p=new byte[10] 是不是跟C++中一样,p位于栈中,存储位置位于堆中?我查了一下,好像C#中没指针,那p又是什么?

解决方案 »

  1.   

    那么在C#中,byte[]p=new byte[10] 是不是跟C++中一样,p位于栈中,存储位置位于堆中?
    正确
    p是引用类型的。跟指针类似
      

  2.   

    .net的对象在内存中随时可能改变地址,GC会经常优化内存使用情况。.net中使用“对象引用”这个概念,它是比c的地址高级的概念,它总是指引到对象,尽管对象的地址经常改变也没有关系。
      

  3.   

    是的,不错,存储方式还是一样的,但是在C#中,是没有指针的定义的,不过你还是可以将它就看成是指针也是可以的,只是不像C++中,需要手动释放资源,C#都为你做好了,所以不存在C++中常见的内存泄露问题。
      

  4.   

    C#有指针啊
    Object ob1 = new Object();
    int* p1 = *ob1;
    int* p2 = p1;
    Object ob2 = &p2;
    相当于
    Object ob1 = new Object();
    Object ob2 = ob1;
      

  5.   

    int i1 = 123;
    int* p1 = *i1;
    int* p2 = p1;
    int i2 = &p2;这回呢,算指针了么?高手赐教
      

  6.   

    一句对象引用茅塞顿开,我又查了一下,有值类型和引用类型,也知道它们是怎么分配内存的。我想再问一下,值类型的通过new定义的,它是分配在哪,例如 int m_iNum=new int();我通过内存查看找不到它,怀疑也分配到了栈中(受C++影响比较大,不搞清楚总感觉不放心)
      

  7.   

    我查了一下,好像可以在不安全代码中使用指针,但是这个指针和C++中的是一个概念吗?
    http://blog.csdn.net/yfqvip/archive/2009/09/24/4588254.aspx
      

  8.   

    C# 中默认是没指针的 
    当然也可以用 不过需要使用unsafe 关键字
    C#程序一般不建议这么做 
      

  9.   

    unsafe int GetSomeNumber(){int* pWidth, pHeight;double* pResult;byte*[] pFlags;}这样的不就是指针吗,在不安全标记内
      

  10.   


    对于你写的这行代码,C#分配和C++是一样的。p在栈中,但是地址在堆中。
    对于C#分配内存有一条铁的规律:所有引用类型一律分配在堆中,数组是引用类型,不是值类型另外C#中有指针的微软保留了它。主要针对值类型和计算使用
      

  11.   

    C#值类型通过new定义的,是在栈中