將項目的“可編譯不安全代碼”屬性設置為true就可以了,方法如下:項目屬性對話框->配置屬性->生成->允許不安全代碼塊
namespace Pointer
{
struct XYZ
{
public int a;
public int b;
public int c;
bool b1;
};
class Program
{
//靜態變量存儲在堆上,查看指針時需用fixed固定
static int m_sZ = 100;
//普通數據成員,也是放在堆上了,查看指針時需用fixed固定
int m_nData = 100;
//等價於C/C++的 #define 語句,不分配內存
const int PI = 31415;
//unsafe可以放在Main函數聲明中!!
static unsafe void Main(string[] args)
{
//簡單的結構變量放在棧上,無需fixed
XYZ stData = new XYZ();
stData.a = 100;
Console.WriteLine("結構變量= 0x{0:x}", (int)&stData);
//數組變量的聲明放在了棧上,數據放在了堆上,需用fixed固定
int[] arry = null;
arry = new int[10];
fixed (int* p = arry)
{
Console.WriteLine("array = 0x{0:x}", (int)p);
}
//這些放在棧上的變量,可以直接使用指針指向
//從打印的指針的數據看,int是4字節的,double是8字節的
int y = 10;
int z = 100;
double f = 0.90;
Console.WriteLine("本地變量y = 0x{0:X}, z = 0x{1:X}", (int)&y, (int)&z);
Console.WriteLine("本地變量f = 0x{0:X}", (int)&f);
//下面失敗
//fixed (int* p = &P.PI)
//{
//}
//放在堆里面的數據的地址,就必須用fixed語句!
string ss = "Helo";
fixed (char* p = ss)
{
Console.WriteLine("字符串地址= 0x{0:x}", (int)p);
}
Program P = new Program();
//這個是類對象,放在堆里面
fixed (int* p = &P.m_nData)
{
Console.WriteLine("普通類成員變量 = 0x{0:X}", (int)p);
}
//靜態成員變量在堆上
fixed (int* p = &m_sZ)
{
Console.WriteLine("靜態成員變量 = 0x{0:X}", (int)p);
}
//下面是每種類型的占用字節個數
Console.Write("\n\n下面是每種類型的占用字節個數\n");
Console.WriteLine("sizeof(void *) = {0}", sizeof(void*));
Console.WriteLine("sizeof(int) = {0}, * = {1}", sizeof(int), sizeof(int*));//4
Console.WriteLine("sizeof(long) = {0}, * = {1}", sizeof(long), sizeof(long*));//8
Console.WriteLine("sizeof(byte) = {0}, * = {1}", sizeof(byte), sizeof(byte*));//1
Console.WriteLine("sizeof(bool) = {0}, * = {1}", sizeof(bool), sizeof(bool*));//1
Console.WriteLine("sizeof(float) = {0}, * = {1}", sizeof(float), sizeof(float*));//4
Console.WriteLine("sizeof(double) = {0}, * = {1}", sizeof(double), sizeof(double*));//8
Console.WriteLine("sizeof(decimal) = {0}, * = {1}", sizeof(decimal), sizeof(decimal*));//16
Console.WriteLine("sizeof(char) = {0}, * = {1}", sizeof(char), sizeof(char*));//
Console.WriteLine("sizeof(XYZ) = {0}, * = {1}", sizeof(XYZ), sizeof(XYZ*));//
//Console.WriteLine("sizeof(object) = {0}, * = {1}", sizeof(object), sizeof(object*));//16
//Console.WriteLine("sizeof(C) = {0}, * = {1}", sizeof(C), sizeof(C*));//16
Console.ReadKey();
}
}
}
