繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM