我的理解,根據MSDN C#固定的語句應該像:不安全字符串的指針聲明
fixed (char* p = str) ... // equivalent to p = &str[0]
這樣,爲什麼我不能老是這樣做呢?
const string str = "1234";
fixed (char* c = &str[0])
{
/// .....
}
如何獲取指向str[1]
的指針?
我的理解,根據MSDN C#固定的語句應該像:不安全字符串的指針聲明
fixed (char* p = str) ... // equivalent to p = &str[0]
這樣,爲什麼我不能老是這樣做呢?
const string str = "1234";
fixed (char* c = &str[0])
{
/// .....
}
如何獲取指向str[1]
的指針?
這是因爲字符串上的[]
運算符是一個返回值的方法。當它是一個原始值類型時從方法返回值沒有地址。
[]
操作者在C#是不一樣的,如C. []
在C中,數組和字符串只是指針,並在指針施加[]
操作,等效於移動指針和解除引用它。這不適用於C#。
其實有你鏈接的MSDN文檔中的錯誤,即固定在latest version.
對這個確切的事情更多解釋見here。
「方法的返回值沒有地址。」不完全正確 - 只是發生了'string [int]'返回的是'char',它不是可以「固定」的類型。 – 2013-04-10 07:17:34
fixed
語句的目的是防止內存分配在虛擬內存之間移動。內存分配由其開始標識,而不是由任何其他地址標識。
所以要保持&str[1]
固定,你真的需要整個str
固定;您可以使用指針算術來根據您的需要從固定指針到str
的單個分配中派生其他指針。
你的代碼改成這樣:
char[] strC = "1234".ToArray();
fixed (char* c = &strC[0])
{
/// .....
}
這給出了一個地址,該地址指向保存第一個字符的內存位置,但不能用於訪問字符串的其他字符。 – 2013-04-10 07:14:01
由於獲得一個指向後面元素直接與陣列工作,但不是用繩子好像唯一的原因是,MS沒有實現它。按照數組的語義,很容易就可以像這樣設計它。
但是,您可以輕鬆地計算指向其他數組元素的另一個指針。所以在實踐中這不是一個大問題:
fixed (char* p = str)
{
char* p1 = p+1;
}
你會得到什麼錯誤? – 2013-04-10 07:02:40
編譯時錯誤: 無法獲取給定表達式的地址 – 2013-04-10 07:04:23
可能的重複[無法獲取給定表達式的地址\t C#指針](http://stackoverflow.com/questions/5079736/cannot-take-the- address-of-given-expressionc-pointer) – 2013-04-10 07:28:07