读书人

函数参数传递的有关问题

发布时间: 2012-04-08 14:38:30 作者: rapoo

求助 函数参数传递的问题
因我之前一直用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]);} 

读书人网 >C#

热点推荐