9

据我了解,根据MSDN C# 固定语句应该像这样工作:

fixed (char* p = str) ... // equivalent to p = &str[0]

那么,为什么我不能这样做?

    const string str = "1234";
    fixed (char* c = &str[0])
    {
/// .....
    }

例如,我如何获得指向str[1]的指针?

4

4 回答 4

7

由于获取指向后面元素的指针直接适用于数组,但不适用于字符串,似乎唯一的原因是 MS 没有实现它。很容易按照数组的语义来设计它。

但是您可以轻松计算另一个指向其他数组元素的指针。所以在实践中这不是一个大问题:

fixed (char* p = str)
{
   char* p1 = p+1;
}
于 2013-04-10T07:17:58.873 回答
4

这是因为[]字符串上的操作符是一个返回值的方法。当原始值类型没有地址时,方法的返回值。

[]C#中的运算符与C中的运算符不同[]。在C中,数组和字符串只是指针,将[]运算符应用于指针,相当于移动指针并取消引用它。这在 C# 中不成立。

实际上,您链接的 MSDN 文档中有一个错误,该错误已在最新版本中修复。

有关此确切问题的更多说明,请参见此处

于 2013-04-10T07:05:55.113 回答
1

fixed语句的重点是防止内存分配跨虚拟内存移动。内存分配由它的开始来标识,而不是由任何其他地址。

所以要保持&str[1]固定,你真的需要整体str固定;然后,您可以根据需要使用指针算法从固定指针派生单个分配中的其他指针str

于 2013-04-10T07:09:25.860 回答
0

将您的代码更改为:

char[] strC = "1234".ToArray();
fixed (char* c = &strC[0])
{
    /// .....
}
于 2013-04-10T07:09:59.187 回答