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

时间:2011-02-22 14:57:13

标签: c# pointers

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

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。

3 个答案:

答案 0 :(得分:12)

  

我的错误是什么?

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

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

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

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

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

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

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

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

答案 1 :(得分:2)

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

char[] mySentence = "Pointers in C#".ToCharArray();

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

    do
    {
        Console.Write(*p);
    }
    while (*(++p) != '\0');
}

Console.ReadLine();

一切都会正常。

答案 2 :(得分:0)

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

使用:

fixed(char* start = &mySentence)

代替。