据我所知,根据MSDN C#,fixed语句应该像:
fixed (char* p = str) ... // equivalent to p = &str[0]
所以,为什么我不能这样做?
const string str = "1234";
fixed (char* c = &str[0])
{
/// .....
}
例如,如何获得指向str[1]
的指针?
答案 0 :(得分:7)
由于获取指向后一个元素的指针直接适用于数组,但不能使用字符串,因此似乎唯一的原因是MS没有实现它。按照数组的语义,可以很容易地设计它。
但是您可以轻松计算指向其他数组元素的另一个指针。所以这在实践中不是一个大问题:
fixed (char* p = str)
{
char* p1 = p+1;
}
答案 1 :(得分:4)
这是因为字符串上的[]
运算符是一个返回值的方法。当方法是原始值类型时,从方法返回值没有地址。
[]
运算符与C中的[]
不同。在C中,数组和字符串只是指针,并且在指针上应用[]
运算符相当于移动指针并取消引用它。这不适用于C#。
实际上,您链接的MSDN文档中存在错误,已在latest version.
中修复有关此问题的详细说明,请参阅here。
答案 2 :(得分:1)
fixed
语句的要点是防止内存分配在虚拟内存中移动。内存分配由其开头标识,而不是由任何其他地址标识。
为了保持&str[1]
不变,您确实需要修复整个str
;然后,您可以根据需要使用指针算法从固定指针到str
的单个分配中派生其他指针。
答案 3 :(得分:0)
将您的代码更改为:
char[] strC = "1234".ToArray();
fixed (char* c = &strC[0])
{
/// .....
}