1、C# 不安全代码:当一个代码块使用 unsafe 修饰符标记时,C# 允许在函数中使用指针变量。
不安全代码或非托管代码是指使用了指针变量的代码块。
补充:什么是受管制(托管)的代码?
托管代码是运行.NET 公共语言运行时CLR的代码。
unsafe:非托管代码,不经过CLR运行,程序员自行分配和释放内存空间。
2、在同一个声明中声明多个指针时,星号 * 仅与基础类型一起写入;而不是用作每个指针名称的前缀。 例如:
int* p1, p2, p3; // 正确
int *p1, *p2, *p3; // 错误(这是C++中的写法)
3、指针与数组
在 C# 中,数组名称和一个指向与数组数据具有相同数据类型的指针是不同的变量类型。例如,int *p 和 int[] p 是不同的类型。您可以增加指针变量 p,因为它在内存中不是固定的,但是数组地址在内存中是固定的,所以您不能增加数组 p。
因此,如果您需要使用指针变量访问数组数据,可以像我们通常在 C 或 C++ 中所做的那样,使用 fixed 关键字来固定指针。例如:
public unsafe static void Main()
{
int[] list = {10, 100, 200};
fixed(int *ptr = list)
/* 显示指针中数组地址 */
for ( int i = 0; i < 3; i++)
{
Console.WriteLine("Address of list[{0}]={1}", i, (int)(ptr + i));
Console.WriteLine("Value of list[{0}]={1}", i, *(ptr + i));
}
Console.ReadKey();
}
4、编译不安全代码
为了编译不安全代码,您必须切换到命令行编译器指定 /unsafe 命令行。