当一个代码块使用unsafe修饰符标记时,C#允许在函数中使用指针变量。不安全代码或非托管代码是指使用了指针变量的代码块。
指针变量
指针是值为另一个变量的地址的变量,即,内存位置的直接地址。就像其他变量或常量,必须在使用指针存储其他变量地址之前声明指针。
指针变量声明的一般形式为:
type * var-name;
下面是指针类型声明的实例:
实例 | 描述 |
---|---|
int* p | p 是指向整数的指针。 |
double* p | p 是指向双精度数的指针。 |
float* p | p 是指向浮点数的指针。 |
int** p | p 是指向整数的指针的指针。 |
int*[] p | p 是指向整数的指针的一维数组。 |
char* p | p 是指向字符的指针。 |
void* p | p 是指向未知类型的指针。 |
在同一个声明中声明多个指针时,星号*仅与基础类型一起写入;而不是用作每个指针名称的前缀。例如:
int * p1,p2,p3;
int *p1,*p2,*p3;
下面的实例说明了C#中使用了unsafe修饰符时指针的使用;
也可以不用声明整个方法作为不安全代码,只需要声明方法的一部分作为不安全代码。下面的实例说明了这点。
使用指针检索数据值
可以使用ToString()方法检索存储在指针变量所引用位置的数据。
实例代码如下:
传递指针作为方法的参数
可以向方法传递指针变量作为方法的参数。
实例代码如下:
使用指针访问数组元素
在 C# 中,数组名称和一个指向与数组数据具有相同数据类型的指针是不同的变量类型。例如,int *p 和 int[] p 是不同的类型。您可以增加指针变量 p,因为它在内存中不是固定的,但是数组地址在内存中是固定的,所以您不能增加数组 p。
因此,如果您需要使用指针变量访问数组数据,可以像我们通常在 C 或 C++ 中所做的那样,使用 fixed 关键字来固定指针。
实例演示如下:
编译不安全代码
为了编译不安全代码,必须切换到命令行编译器指定、unsafe命令行。
例如,为了编译包含不安全代码的名为prog1.cs的程序,需在命令行中输入命令:
csc / unsafe prog1.cs
如果使用的是Visual Studio IDE,那么需要在项目属性中启用不安全代码。
步骤如下:
1.通过双击资源管理器(Solution Explorer)中的属性(properties)节点,打开项目属性(project properties)。
2.点击Build标签页。
3.选择选项“Allow unsafe code”。