[英]How to pass a int * to a function having parameter of type int []?
如何将int指针传递给参数类型为int []的函数? 我需要从下面的代码传递指针数据:
char* data = stackalloc char[123];
参数为int []的函数。
foo(char [])
跟进问题:
int []如何在C#中表示? 它与C ++(指针?)相同吗?
除非有充分的理由,否则不要使用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字符,不应该用于非字符数据。
阅读: 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];
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.