如何将int *传递给参数类型为int []的函数?

时间:2015-07-10 07:04:51

标签: c# pointers

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

char* data = stackalloc char[123];

到参数为int []的函数。

foo(char [])

跟进问题:

如何在C#中表示int []?它与C ++中的相同(指针?)

2 个答案:

答案 0 :(得分: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(再次,你真的不应该,大部分时间),所有处理指针的方法必须是{{ 1}},他们必须采用指针参数:

unsafe

原因很简单 - private unsafe void HandleArray(int* array) { // Do whatever } 代码不能由运行时验证,而指针不是数组。虽然你可以做unsafe,但指针上没有这样的东西(显然) - 它们是完全不同的类型。

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

答案 1 :(得分:1)

阅读本文:https://msdn.microsoft.com/en-us/library/4d43ts61(v=vs.90).aspx

由于数组是引用类型,因此在将数组传递给函数时,会将引用(或指针)传递给数组。

你会像这样传递它:

int[] arr = {1, 2, 3};
foo(arr);

这就是你在C#中创建一个char数组的方法:

char[] data = new char[123];