请问在C#里怎样获得一个二维数组没一行的首地址?
如题,谢谢! 问题点数:50、回复次数:8Top
1 楼Sunmast(速马@Redmond, WA)回复于 2005-08-02 00:26:40 得分 20
首元素地址:
[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();
}
数组内的数据是顺序排列的,所以其他行的首地址可以偏移得到
不过你要用这种代码做什么?Top
2 楼zhilunchen(他山居士)回复于 2005-08-02 00:54:30 得分 0
强!Top
3 楼zeusvenus()回复于 2005-08-02 07:40:48 得分 0
厉害,偶还在想中已经有现成的实现了。Top
4 楼Brunhild()回复于 2005-08-02 08:00:47 得分 20
不必使用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))
Top
5 楼cdo(Everything has a favourable turn)回复于 2005-08-02 08:54:47 得分 0
MVP出马了,我只能支持了.Top
6 楼superfishmanweb(我也是千百个不愿意呀)回复于 2005-08-02 09:09:09 得分 0
markTop
7 楼GmLibra(平常心)回复于 2005-08-02 09:10:49 得分 5
顶Top
8 楼Sunmast(速马@Redmond, WA)回复于 2005-08-02 12:38:47 得分 5
@Brunhild():
用Marshal类确实可以得到其地址。但由于数组是在GC堆上的,而GC会移动GC堆上的对象,所以要得到数组的地址并且使用,必须先固定它
fixed{}代码块就是用于解决这个问题
所以必须使用unsafe上下文,嗯Top




