2015-07-10 137 views
3

如何將int指針傳遞給參數類型爲int []的函數? 我需要從下面代碼傳遞指針數據:如何將int *傳遞給參數類型爲int []的函數?

char* data = stackalloc char[123]; 

與INT []的參數的函數。

foo(char []) 

後續問題:

是如何INT []表示在C#中?是它等同於C++(指針?)

+1

你使用C#嗎?如果是這樣,你想與C++代碼進行互操作嗎?因爲你的問題不清楚。 –

+0

對不起,我忘了提及的語言。它在C# – vrnithinkumar

+0

'foo(int [])'也是一個C#函數嗎? – phoog

回答

3

,除非你有一個很好的理由不要使用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字符,不應該用於非字符數據。

+0

所以我不能傳遞char *到char []在c#中? 我應該修改函數參數爲char *? – vrnithinkumar

+0

@vrnithinkumar是的,你不能。你爲什麼首先使用'char *'工作?在C#中使用指針的原因很少。 – Luaan

相關問題