2010-07-13 64 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

相關問題