C# 如何将int*传递给具有int[]类型参数的函数?
如何将int指针传递给具有int[]类型参数的函数? 我需要从以下代码传递指针数据:C# 如何将int*传递给具有int[]类型参数的函数?,c#,pointers,C#,Pointers,如何将int指针传递给具有int[]类型参数的函数? 我需要从以下代码传递指针数据: char* data = stackalloc char[123]; 指向参数为int[]的函数 foo(char []) 跟进问题: int[]如何用C#表示?是否与C++(指针?) 相同: 因为数组是引用类型,所以当您将数组传递给函数时,您将传递一个指向该数组的引用(或指针) 您可以这样简单地传递它: int[] arr = {1, 2, 3}; foo(arr); 这就是在C#中创建字符数组的方法:
char* data = stackalloc char[123];
指向参数为int[]的函数
foo(char [])
跟进问题:
int[]如何用C#表示?是否与C++(指针?) 相同:
因为数组是引用类型,所以当您将数组传递给函数时,您将传递一个指向该数组的引用(或指针)
您可以这样简单地传递它:
int[] arr = {1, 2, 3};
foo(arr);
这就是在C#中创建字符数组的方法:
除非有充分的理由,否则不要使用不安全的代码 在任何情况下,您只能在
safe
code中使用和操作指针。您的Foo
方法接受int[]
,不接受int*
,不接受char*
,不接受void*
int[]
是安全且可验证的-char*
不是。您根本无法传递指针,更不用说不同类型的指针了
我想你只是对C语言的工作原理感到困惑,你正试图用C语言编写C代码。如果要使用整数数组,请使用整数数组。如果要使用字符数组,请使用字符数组
数组是C#中的一种实际类型,与C的语法糖不同——这意味着它们更容易使用,但也意味着它们的行为与C非常不同。同样,除非必要,否则不应该真正使用stackalloc
——将内存管理留给运行时,99%的时间都是这样。只有当您将此代码确定为瓶颈时,才考虑这样的黑客行为,即使如此,也只有在性能改进(如果有)值得的情况下
是的,在C#中使用数组就像这样简单:
如果您需要stackalloc
(同样,在大多数情况下,您确实不应该这样做),那么处理该指针的所有方法都必须是不安全的,并且它们必须采用指针参数:
private unsafe void HandleArray(int* array)
{
// Do whatever
}
原因很简单-不安全
运行时无法验证代码,指针也不是数组。虽然您可以执行integerArray.Length
,但指针上没有这样的操作(显然)-它们是完全不同的类型
另一个警告:char
与C/C++中的不同。如果需要字节数组,请使用byte[]
-char
实际上是一个unicode字符,不应用于非字符数据。是否使用C#?如果是这样,您是否试图与C++代码进行互操作?因为你的问题不清楚。对不起,我忘了提语言了。它在C#中是foo(int[])
也是一个C#函数?但是你使用的是char*而不是int?对不起,我的错。那只是炭。foo(char[])是一个C#函数,所以我不能在C#中将char*传递给char[]?我应该将函数参数修改为char*?@vrnithinkumar是的,您不能。首先,您为什么要使用char*
?很少有理由在C#中使用指针。
var integerArray = new int[] { 1, 2, 3 };
var charArray = new char[] { 'a', 'b', 'c' };
MethodTakingIntArray(integerArray);
MethodTakingCharArray(charArray);
private unsafe void HandleArray(int* array)
{
// Do whatever
}