2010-07-13 78 views
12

简单的问题,我导入一个DLL函数,参数是int *。 当我尝试输入Method(0)时,出现一个错误提示:“int和int *不能转换”。DotNet - 什么是int *?

这是什么意思?

回答

15

这是pointer to an int的经典C符号。只要类型后跟*,就表示该类型为该类型的pointer。在C#中,与C不同,除了在项目属性中启用unsafe代码之外,还必须明确定义函数为unsafe以使用指针。指针类型也不能直接与具体类型互换,因此必须先引用类型的引用。要在C#中获得指向另一种类型(例如int)的指针(或针对该问题的C & C++),必须在变量的前面使用取消引用运算符&(与号),以获得指向的变量:

unsafe 
{ 
    int i = 5; 
    int* p = &i; 
    // Invoke with pointer to i 
    Method(p); 
} 

“不安全”的代码C#

下面是不安全的代码的一些关键文章,并在C#中使用指针。

+0

要在此处添加,“&”将获得“int i”的指针(地址) ... – Nate 2010-07-13 15:11:12

+0

@Nate:好的一点,我会添加一个解引用运算符的更好的解释。 – jrista 2010-07-13 15:57:24

+0

在这里相同的评论:它与不安全的代码无关。参数只是通过引用传递。 C#中的“ref”关键字。它是C#中的一个指针,并且在JIT编译器完成时也是如此。 – 2010-07-15 12:24:00

6

这是一个pointer to an int。通常最好在托管代码中避免。您可能想要发布您的导入方法声明。一个IntPtr通常足够用于这种互操作。

+1

这只是一个通过引用传递的参数。这是由P/Invoke编组提供的良好支持,使用IntPtr是一个错误。 – 2010-07-13 15:40:42

+2

取决于它的功能。如果它是一个数组,'int []'就是你想要的。如果是句柄,'IntPtr'通常是最好的,特别是当你计划传递0时。如果你想实际引用一个int,'ref int'或'out int'可能会更好。 – Blindy 2010-07-13 16:01:47

+1

如果没有看到方法声明,我就无法猜测其中一种方法(ref和数组vs指针)。 @Bindind对这些钱是正确的。取决于所调用的方法。例如,SendMessage的LPARAM通常编组为IntPtr,并且该家伙通常拥有一个内存指针(可以表示为int *) – dkackman 2010-07-13 16:16:09

2

这取决于您使用的语言。在C#中,您应该使用“ref”关键字声明参数。在VB.NET中,你应该使用ByRef关键字。你需要通过传递一个变量来调用它,而不是一个常量。类似这样的:

int retval = 0; 
Method(ref retval); 
// Do something with retval 
//... 
+0

参考文献实际上与接受的答案中使用的相同吗? – 2014-09-04 11:11:06

+0

抖动完成后的引擎盖下,是的。 – 2014-09-04 11:44:12

+0

如果他使用的DLL的作者决定了C#签名'Method(int * p)',那么他不能用方法'Method(ref retval)'调用该方法;'你建议,对吧? DLL的作者_could_选择了一个签名'Method(ref int p)',但由于某种原因,他们没有。 C#没有为'ref int'类型的变量提供“算术”,例如增加到“下一个”地址,它对指针“int * p”的处理方式(如C#'p ++'等等,“不安全”)。 。 – 2017-07-03 10:50:46