2015-07-10 134 views
3

如何将int指针传递给参数类型为int []的函数? 我需要从下面代码传递指针数据:如何将int *传递给参数类型为int []的函数?

char* data = stackalloc char[123]; 

与INT []的参数的函数。

foo(char []) 

后续问题:

是如何INT []表示在C#中?是它等同于C++(指针?)

+1

你使用C#吗?如果是这样,你想与C++代码进行互操作吗?因为你的问题不清楚。 –

+0

对不起,我忘了提及的语言。它在C# – vrnithinkumar

+0

'foo(int [])'也是一个C#函数吗? – phoog

回答

3

,除非你有一个很好的理由不要使用unsafe代码。

在任何情况下,您只能使用和操纵unsafe代码中的指针。您的Foo方法接受int[],而不是int*,而不是char*,而不是void*int[]是安全且可验证的 - char*不是。你根本不能传递一个指针,更不用说一个不同类型的指针。

我假设你对C#的工作方式感到困惑,而你正试图用C#编写C代码。如果你想使用整数数组,使用整数数组。如果您想使用char数组,请使用char数组。

数组是C#中的一种实际类型,与C的语法糖不同 - 这意味着它们更易于使用,但这也意味着它们的行为与C非常不同。同样,您不应该真的除非需要,否则使用stackalloc - 将内存管理留给运行时间,99%的时间。只有在您将此代码识别为瓶颈时才考虑这种黑客行为,即使如此,只有在性能改进(如果有)的情况下才值得。

所以,是的,使用数组是如此简单的C#:

var integerArray = new int[] { 1, 2, 3 }; 
var charArray = new char[] { 'a', 'b', 'c' }; 

MethodTakingIntArray(integerArray); 
MethodTakingCharArray(charArray); 

如果需要stackalloc(同样,你真的不应该,大部分的时间),所有的处理该指针方法必须是unsafe,他们必须采取指针参数:

private unsafe void HandleArray(int* array) 
{ 
    // Do whatever 
} 

原因很简单 - unsafe号不是可验证运行时和指针不是数组。虽然你可以做integerArray.Length,但指针上没有这样的东西(显然) - 它们是完全不同的类型。

另一个警告:char与C/C++中的不同。如果你想要一个字节数组,使用byte[] - char实际上是一个unicode字符,不应该用于非字符数据。

+0

所以我不能传递char *到char []在c#中? 我应该修改函数参数为char *? – vrnithinkumar

+0

@vrnithinkumar是的,你不能。你为什么首先使用'char *'工作?在C#中使用指针的原因很少。 – Luaan

相关问题