如何将int指针传递给参数类型为int []的函数? 我需要从下面的代码中传递指针数据:
char* data = stackalloc char[123];
到参数为int []的函数。
foo(char [])
跟进问题:
如何在C#中表示int []?它与C ++中的相同(指针?)
答案 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];