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