unsafe 关键字,以示警戒。
首先,你得在项目文件 (.csproj) 里允许不安全代码。
true
指针存的是内存地址,不是值。
unsafe
{
int a = 10;
int* p = &a; // & 取地址:p 指向了 a 的内存地址
Console.WriteLine((long)p); // 输出一个内存地址(如 1407328000)
*p = 20; // * 解引用:通过地址修改值
Console.WriteLine(a); // a 变成了 20!
}
因为 C# 有个“清道夫”(GC),它会偷偷移动内存里的对象(整理碎片)。
如果你拿着一个地址,结果对象被 GC 移走了,你就指了个寂寞。
所以必须用 fixed 把对象钉在内存里,不让 GC 动它。
int[] arr = { 1, 2, 3 };
unsafe
{
fixed (int* p = arr) // 钉住数组
{
// 现在可以安全地用指针遍历数组了
for (int i = 0; i < 3; i++)
{
Console.WriteLine(*(p + i)); // 指针算术
}
}
}
编写一个 unsafe 方法 Swap(int* a, int* b)。
用指针来交换两个整数的值。
(注意:这段代码可能需要在 VS Code 中配置 AllowUnsafeBlocks 才能运行)
unsafe static void Swap(int* a, int* b)
{
int temp = *a;
*a = *b;
*b = temp;
}
unsafe static void Main()
{
int x = 1, y = 2;
Swap(&x, &y);
Console.WriteLine($"x={x}, y={y}");
}