C# IntPtr类型和使用/unsafe选项编译程序

Posted bcbobo21cn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# IntPtr类型和使用/unsafe选项编译程序相关的知识,希望对你有一定的参考价值。

1 IntPtr类型

    C#中的IntPtr类型称之为“平台特定的整数类型”,用于本机资源,例如窗口句柄;
    资源的大小取决于使用的硬件和操作系统,即此类型的实例在32位硬件和操作系统中将是32位,在64位硬件和操作系统中将是64位;但其大小总是足以包含系统的指针(因此也可以包含资源的名称)。

    在调用API函数时,类似含有窗口句柄参数(HANDLE)的原型函数,应显示地声明为IntPtr类型。

    IntPtr类型对多线程操作是安全的。

    int 和IntPtr互转:
    int i=1; IntPtr p=new IntPtr(i);  int ch_i=(int) p;

    IntPtr和string互转:
    string str="a";
    IntPtr p=Marshal.StringToHGlobalAnsi(str);

    string s=Marshal.PtrToStringAnsi(p);
    Marshal.FreeHGlobal(p);

2 写一个程序比较指针和IntPtr

代码,

using System;
using System.Runtime.InteropServices;

unsafe class Program {
    static void Main(string[] args) {
        int variable = 42;
        int* p = &variable;
        Console.WriteLine(*p);
        IntPtr raw = (IntPtr)p;
        Marshal.WriteInt32(raw, 666);
        p = (int*)raw;
        Console.WriteLine(*p);
        Console.ReadLine();
    }
}

看命名空间;

首先p是一个指针,先输出p所指的值;

然后使用IntPtr;在相同地址写入值 666 ;然后再输出p所指的值;

将程序存为test1.cs,拷贝到netframework目录,在命令行编译;

构建过程和程序输出如下图;此程序在命令行使用csc.exe编译,必须加 /unsafe 选项,才能编译通过;

 

以上是关于C# IntPtr类型和使用/unsafe选项编译程序的主要内容,如果未能解决你的问题,请参考以下文章

C# 错误CS0227 不安全代码只会在使用 /unsafe 编译的情况下出现

如何在 C# 中获取 IntPtr 指针的属性

在 C# 中传递 IntPtr 指针后,在非托管 C++ 代码中分配数组,编组类型

C指针(2):指针的长度和类型

为啥我会收到错误“不安全代码可能仅在使用 /unsafe 编译时出现”?

c# 调用c dll void 指针类型转化问题