日期:2014-05-18  浏览次数:20999 次

求助 函数参数传递的问题
因我之前一直用C++的,目前一个项目必须用C#,
现在2个问题,熟悉C#的大大指导一下

问题1:
在C++中:
C/C++ code

void f2(int a[])
{

}

void f1()
{
    int a[10];
    f2(a + 5); //C++中可直接传a[5]的地址给f2函数
}



然而C#中:
C# code

static void f2(int a[])
{

}

static void f1()
{
    int a[10];
    f2(a + 5); //C#中不可直接传a[5]的地址给f2函数
}



在C#中,每个类型都是对象,按C++的思路传不了。
请问怎么实现这个操作呢?


问题2:
在C++中:
C/C++ code

void f2(UINT32 *a)
{

}

void f1()
{
    UINT8 a[10];
    f2((UINT32 *)a); //C++中可直接强制把UINT8*转换为UINT32*并传给f2函数
}


然而C#中:
C# code

static void f2(uint a[])
{

}

static void f1()
{
    byte a[10];
    f2(???); //C#中试过,但都不成功,怎么传呢?
}


在C#中,请问又该怎么实现这个操作呢?
郁闷了一天,希望有人指点迷津~

------解决方案--------------------
问题一:你需要创建一个新的数组,用老数组的内容复制到新数组,从偏移地址5开始复制,然后拿新数组传递给你的函数f2。如果要提高效率,你也可以改造你的f2函数,让它增加一个参数(偏移地址)。

问题二:指针是为了某些需要高效率操作的场合而保留的,且必须用fixed关键字将内存地址固定,函数必须声明为unsafe,且启用不安全代码。由于C#的指针无法和实际的类进行交互操作,所以特殊类型是不推荐用指针来操作的,一般指针是对byte[]这样的内存原始数据操作才会去使用。
------解决方案--------------------
第一个,如果只是希望修改a[5]的值,那么用ref a[5]
如果还希望通过a[5]找到a[6] a[7],那还是把a传过去吧

第二个,10除以4余2啊,貌似只能用BitConverter一个一个转UInt32

c#本身也有指针,不过我没用过,你自己试试
C# code
unsafe class Program
{
    static void f2(int* a)
    {
    }

    static void f3(UInt32* a)
    {
    }

    static void f1()
    {
        fixed (int* a = new int[10])
        {
            f2(a + 5);
            f3((UInt32*)a);
        }
    }
}

------解决方案--------------------
C# code

static void f2(ref int a)
{

}

static void f1()
{
    int a[10];
    f2(ref a[5]);
}