【问题标题】:How to pass a int * to a function having parameter of type int []?如何将 int * 传递给具有 int [] 类型参数的函数?
【发布时间】:2015-07-10 07:04:50
【问题描述】:

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

char* data = stackalloc char[123];

到一个参数为 int [] 的函数。

foo(char [])

跟进问题:

C# 中的 int[] 是如何表示的?和 C++ 中的一样吗(指针?)

【问题讨论】:

  • 您使用的是 C# 吗?如果是这样,您是否尝试与 C++ 代码互操作?因为你的问题不清楚。
  • 对不起,我忘了提及语言。它在 C# 中
  • foo(int [])也是C#函数吗?
  • 但是您使用的是 char* 而不是 int?
  • 对不起,我的错。它只是字符。而 foo(char []) 是一个 C# 函数。

标签: c# pointers


【解决方案1】:

除非你有充分的理由,否则不要使用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 字符,不应该用于非字符数据。

【讨论】:

  • 所以我不能在 c# 中将 char* 传递给 char [] 吗?我应该将函数参数修改为 char * ?
  • @vrnithinkumar 是的,你不能。你为什么首先与char * 合作?在 C# 中使用指针的理由很少。
【解决方案2】:

阅读: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];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-07
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-26
    相关资源
    最近更新 更多