刚开始我以为c#没有指针,后来才发现c#是可以使用指针的,但前提是使用了unsafe声明。不过更多的情况下还是用delegate委托来代替指针,使用指针会导致线程不安全。下面是几个简单的例子:
- 例一:将方法声明为unsafe
namespace UnsafeMethodApp
{
class Program
{
//将使用了指针的方法声明为unsafe
static unsafe void Main(string[] args)
{
int var = 20;
int* p = &var;
Console.WriteLine("Data is: {0} ", var);
Console.WriteLine("Address is: {0}", (int)p);
Console.ReadKey();
}
}
}
vs2012运行结果:
UnsafeMethodApp.PNG
- 例二:将代码块声明为unsafe
namespace UnsafeCodeApp
{
class Program
{
public static void Main(string[] args)
{
//将使用了指针的代码块声明为unsafe,这样使用了指针的方法(函数)就不需要声明为unsafe了
unsafe
{
int var = 10;
int* p = &var;
Console.WriteLine("var:{0}", var);
//可以使用 ToString() 方法检索存储在指针变量所引用位置的数据
Console.WriteLine("var:{0}", p->ToString());
Console.WriteLine("Address:{0}", (int)p);
}
Console.ReadKey();
}
}
}
vs2012运行结果:
UnsafeCodeApp.PNG
- 例三:指针与数组结合使用
namespace PointerArrayApp
{
class Program
{
public static unsafe void Main(string[] args)
{
int[] list = { 10, 200, 3000 };
//使用指针访问数组,得先使用关键字fixed固定指针,这样我们就可以像c/c++那样使用指针了
fixed(int* p = list)
for (int i = 0; i < 3; i++)
{
Console.WriteLine("Address of list[{0}]:{1}", i, (int)(p + i));
Console.WriteLine("Value of list[{0}]:{1}", i, *(p + i));
}
Console.ReadKey();
}
}
}
vs2012运行结果:
PointerArrayApp.PNG
- 例四:使用指针作为函数参数
namespace PointerAsParaApp
{
class Program
{
public unsafe void swap(int* a, int* b)
{
int temp = *a;
*a = *b;
*b = temp;
}
static unsafe void Main(string[] args)
{
Program pObj = new Program();
int var1 = 10;
int var2 = 20;
int* x = &var1;
int* y = &var2;
Console.WriteLine("Before swap,var1:{0},var2:{1}", var1, var2);
pObj.swap(x, y);
Console.WriteLine("Before swap,var1:{0},var2:{1}", var1, var2);
Console.ReadKey();
}
}
}
vs2012运行结果:
PointerAsParaApp.PNG
网友评论