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 选项,才能编译通过;

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值