不能取给定表达式C#指针的地址

在不安全的上下文中考虑以下代码:

string mySentence = "Pointers in C#"; fixed (char* start = mySentence) // this is the line we're talking about { char* p = start; do { Console.Write(*p); } while (*(++p) != '\0'); } Console.ReadLine(); 

这很好用。

根据http://msdn.microsoft.com/en-us/library/f58wzh21(v=VS.100).aspx我应该能够替换我标记的行

 fixed(char* start = &mySentence[0]) 

但不幸的是VS给了我以下错误。

无法获取给定表达式的地址

错误在我身边吗?

VS.NET 2010 Premium。

错误在我身边吗?

没有; 错误发生在您链接到的文档中。 它指出:

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

评论不正确; 正如您所记录的那样,获取字符串内部的地址是不合法的。 获取数组内部的地址是合法的。

固定声明的合法初始化者是:

  • 地址运算符&应用于变量引用。
  • 数组
  • 一个字符串
  • 固定大小的缓冲区。

str[0]不是变量引用,因为首先,字符串元素不是变量,第二,因为这是对索引函数的调用,而不是对变量的引用。 它也不是数组,字符串或固定大小的缓冲区,因此它不应该是合法的。

我将与文档管理员聊聊,我们将看看是否可以在以后的文档修订版中修复此问题。 谢谢你引起我的注意。

更新:我已经与其中一位文档管理员交谈,他们告诉我,我们刚刚通过了下一次计划修订文档的截止日期。 建议的更改将在下一个版本的队列中进行修订。

这不起作用,因为您正在尝试访问字符串。 如果您将代码更改为:

 char[] mySentence = "Pointers in C#".ToCharArray(); fixed (char* start = &mySentence[0]) { char* p = start; do { Console.Write(*p); } while (*(++p) != '\0'); } Console.ReadLine(); 

一切都会好起来的。

mySentence [0]返回一个只读单个字符,你无法获得指向该字符的指针。

使用:

 fixed(char* start = &mySentence) 

代替。