由于C#没有指针,所以通过给函数传入指针来【操作】一个变量,尤其是字符串和数组时会非常麻烦。
像这样的操作在C#里面就不太方便实现:
int Compare(int a, int b, int *sum) //输出两个数里更大的那个数和两数之和
{
*sum=a+b; //*sum表示指针sum存储地址里的值,直接改变地址存储的信息
if (a>b) return a;
else return b;
}
int main()
{
int a,b,s;
input(a,b);
cout<<Compare(a,b,&s); //&的意思是取该变量的存储地址
cout<<s;
return 0;
}
尤其是用C或C++写的DLL,里面有很多传入指针的函数,C#调用这些DLL就很麻烦。
首先C#里面使用指针相关,需要unsafe代码块。比如:
[DllImport("D:/学习/C++串口/CppSerialPort2/CppSerialPort2/Debug/CppSerialPort2")]
unsafe static extern void JustATest(int* a,int* b);
注意这里是DLLImport的一个特殊格式,在其他地方用这个unsafe,应该是一个块,比如:
int x;
unsafe
{
Command(&x);
}
这里是传入单个变量的地址,实现函数对变量的操作。如果要传入数组,则更麻烦,需要使用fixed语句,这是让一个变量始终指向一个内存地址,而且它必须在unsafe代码块里面用。
int[] a = new int[50];
int[] b = new int[50];
unsafe
{
fixed (int* aa = a)
fixed (int* bb = b)
JustATest(aa, bb);
}