如题,谢谢!

解决方案 »

  1.   

    首元素地址:
    [STAThread]
    static unsafe void Main(string[] args)
    {
    int[,] matrix = new int[3,3];
    fixed(int* pi = &matrix[0,0])
    {
    Console.WriteLine("{0:X}", (uint)pi);
    } Console.ReadLine();
    }数组内的数据是顺序排列的,所以其他行的首地址可以偏移得到不过你要用这种代码做什么?
      

  2.   

    不必使用UNSAFE代码:
    /// <summary>
    /// 获取指定二维数组的某个元素的地址
    /// </summary>
    /// <param name="matrix">要检测的二维数组</param>
    /// <param name="row">二维数组的行号</param>
    /// <param name="col">二维数组的列号</param>
    /// <returns>指定元素的地址</returns>
    static int GetAddress(int[,] matrix, int row, int col)
    {
    int pos=(matrix.GetUpperBound(0)+1)*row+col;
    IntPtr ptr=System.Runtime.InteropServices.Marshal.UnsafeAddrOfPinnedArrayElement(matrix, pos);
    return ptr.ToInt32();
    }示例:
    Console.WriteLine("{0:X}", GetAddress(matrix, 0,0))
      

  3.   

    @Brunhild():
    用Marshal类确实可以得到其地址。但由于数组是在GC堆上的,而GC会移动GC堆上的对象,所以要得到数组的地址并且使用,必须先固定它
    fixed{}代码块就是用于解决这个问题所以必须使用unsafe上下文,嗯