带指针的不安全C#代码段

Zak*_*aki 3 c# pointers

我遇到了以下代码片段,需要预测输出.我的答案是220,但被告知错了.有人能告诉我正确的输出,请解释原因.

using System;
class pointer
{
  public static void Main()
  {
   int ptr1=0;
   int* ptr2=&ptr1;
   *ptr2=220;
   Console.WriteLine(ptr1);
  }
}
Run Code Online (Sandbox Code Playgroud)

编辑:谢谢大家的解释性答案.当且仅当上面的代码块(这是C#代码,很抱歉没有在问题中提及它)被声明为非托管时,正确答案肯定是220.谢谢你的所有答案.每个人都非常有用,而且很有帮助.

IRB*_*BMe 6

答案是它没有编译.您将收到以下错误:

错误CS0214:指针和固定大小的缓冲区只能在不安全的上下文中使用

但是,如果你这样写:

int ptr1 = 0;

unsafe {
    int* ptr2 = &ptr1;
    *ptr2 = 220;
}

Console.WriteLine(ptr1);
Run Code Online (Sandbox Code Playgroud)

那你肯定会得到220.

您还可以创建一个完整的不安全方法,而不是创建特定的不安全块:

public unsafe void Something() {
    /* pointer manipulation */
}
Run Code Online (Sandbox Code Playgroud)

注意:您还必须使用/ unsafe开关进行编译(在Visual Studio的项目属性中选中"允许不安全的代码")

编辑:看看指针有趣的binky一个简短,有趣,但信息丰富的指针视频.


Zyp*_*rax 5

结果是220,下面是一个C#代码片段来测试它(这里没有C++)

using System;

internal class Pointer {
    public unsafe void Main() {
        int ptr1 = 0;
        int* ptr2 = &ptr1;
        *ptr2 = 220;

        Console.WriteLine(ptr1);
    }
}
Run Code Online (Sandbox Code Playgroud)

步骤:

  • PTR1被赋值为0
  • PTR2指向PTR1的地址空间
  • PTR2被赋值220(但指向PTR1的地址空间)
  • 因此,当现在请求PTR1时,该值也是220.

请你的老师给我一个A;)