代码之家  ›  专栏  ›  技术社区  ›  Callum Rogers

Intptr到底是什么?

  •  154
  • Callum Rogers  · 技术社区  · 16 年前

    通过使用IntelliSense并查看其他人的代码,我发现了这一点 IntPtr 类型;每次需要使用它时,我只是简单地 null IntPtr.Zero 发现大部分功能都可以工作。具体是什么?何时/为什么使用?

    8 回复  |  直到 7 年前
        1
  •  144
  •   Sam Harwell    16 年前

    它是一个“本机(平台特定的)大小整数”,内部表示为 void* 但显示为整数。当需要存储非托管指针且不想使用时,可以使用它 unsafe 代码。 IntPtr.Zero 有效地 NULL (空指针)。

        2
  •  57
  •   John Smith jjcaicedo    9 年前

    它是一个足够大的值类型,可以存储本机或不安全代码中使用的内存地址,但不能直接用作安全托管代码中的内存地址。

    你可以使用 IntPtr.Size 以查明您是在32位进程还是64位进程中运行,因为它分别是4字节还是8字节。

        3
  •  35
  •   bufferz    16 年前

    下面是一个例子:

    我正在编写一个与高速摄像机接口的C程序。相机有自己的驱动程序,可以自动获取图像并将其加载到计算机的内存中。

    因此,当我准备好将最新的图像带到我的程序中使用时,相机驱动程序为我提供了一个intptr,用于图像已经存储在物理内存中的位置,因此我不必浪费时间/资源来创建另一个内存块来存储已经存在于内存中的图像。Intpr只显示了图像的位置。

        4
  •  31
  •   Community Mohan Dere    8 年前

    直接的解释

    国际乒乓球联合会 是一个 整数 和A的尺寸一样 指针 .

    可以使用intptr以非指针类型存储指针值。此功能在.NET中很重要,因为使用指针非常容易出错,因此在大多数上下文中都是非法的。通过允许指针值存储在“安全”数据类型中,在 不安全的 代码段可以用更安全的高级代码实现,甚至可以用不直接支持指针的.NET语言实现。

    intptr的大小是平台特定的,但很少需要考虑这个细节,因为系统将自动使用正确的大小。

    “intptr”这个名字让人困惑——比如 Handle 可能更合适。我最初的猜测是“intptr”是一个指针 整数。这个 MSDN documentation of IntPtr 深入到一些神秘的细节中,却从来没有对名字的含义提供太多的洞察。

    另一种观点

    IntPtr 指针有两个限制:

    1. 不能直接取消引用
    2. 它不知道它指向的数据类型。

    换句话说,一个 国际乒乓球联合会 就像一个 void* --但有了额外的特性,它可以(但不应该)用于基本指针算术。

    为了取消引用 国际乒乓球联合会 ,您可以将其强制转换为真正的指针(只能在“不安全”的上下文中执行的操作),也可以将其传递给助手例程,如 InteropServices.Marshal 班级。使用 Marshal 类提供了安全的假象,因为它不要求您处于显式的“不安全”上下文中。但是,它不能消除使用指针时固有的崩溃风险。

        5
  •  11
  •   WonderWorker Sakal    9 年前

    什么是指针?

    在所有语言中,指针是存储内存地址的变量类型,您可以让它们告诉您 地址 他们指向或 地址值 他们指着。

    指针可以被看作是一种书签。但是,指针不是用来快速跳转到书中的一页,而是用来跟踪或映射内存块。

    想象一下您的程序内存正好是一个65535字节的大数组。

    指针指向服从

    指针记住每个内存地址,因此它们都指向内存中的单个地址。

    作为一个组,指针记住并调用内存地址,服从您的每一个命令,令人恶心。

    你是他们的国王。

    C语言中的指针

    具体地说,在C中,指针是一个整数变量,它存储0到65534之间的内存地址。

    指针也是特定于c_的,属于int类型,因此有符号。

    但是,您不能使用负数地址,也不能访问高于65534的地址。任何这样做的尝试都将引发System.AccessViolationException。

    一个指针调用 鼠标指针 声明如下:

    INT* MyPointer;

    C中的指针是一个int,但C_中的内存地址从0开始,扩展到65534。

    尖锐的事情要特别小心处理。

    不安全字 目的是吓唬你,有一个很好的理由:指针是尖头的东西,尖头的东西,如剑、斧、指针等,应该特别小心处理。

    指针赋予程序员对系统的严格控制。因此,所犯的错误可能会产生更严重的后果。

    为了使用指针,必须在程序的属性中启用不安全代码,并且指针只能在标记为不安全的方法或块中使用。

    不安全块示例

    unsafe
    {
        // Place code carefully and responsibly here.
    
    }
    

    如何使用指针

    当变量或对象被声明或实例化时,它们存储在内存中。

    • 使用*符号前缀声明指针。

    int *MyPointer;

    • 要获取变量的地址,请使用&symbol前缀。

    MyPointer = &MyVariable;

    将地址分配给指针后,将应用以下内容:

    • 不带*前缀,表示作为int指向的内存地址。

    MyPointer = &MyVariable; // Set MyPointer to point at MyVariable

    • 以*前缀获取存储在所指向的内存地址的值。

    "MyPointer is pointing at " + *MyPointer;

    由于指针是保存内存地址的变量,因此该内存地址可以存储在指针变量中。

    小心和负责地使用指针的示例

        public unsafe void PointerTest()
        {
            int x = 100; // Create a variable named x
    
            int *MyPointer = &x; // Store the address of variable named x into the pointer named MyPointer
    
            textBox1.Text = ((int)MyPointer).ToString(); // Displays the memory address stored in pointer named MyPointer
    
            textBox2.Text = (*MyPointer).ToString(); // Displays the value of the variable named x via the pointer named MyPointer.
    
        }
    

    注意指针的类型是int。这是因为c将内存地址解释为整数(int)。

    为什么是int而不是uint?

    没有充分的理由。

    为什么要使用指针?

    指针很有趣。由于计算机的大部分都是由内存控制的,指针赋予程序员更多的程序内存控制权。

    内存监控。

    使用指针读取内存块并监视被指向的值随时间的变化。

    负责任地更改这些值,并跟踪更改对计算机的影响。

        6
  •  7
  •   Yvo    16 年前

    MSDN告诉我们:

    intptr类型设计为 大小为的整数 平台特定。也就是说, 此类型的实例应为 在32位硬件上为32位,并且 操作系统和64位 64位硬件和操作系统。

    Intptr类型不能由 支持指针的语言,以及 作为参考数据的常用方法 在执行和不执行的语言之间 支持指针。

    Intptr对象也可用于 握住把手。例如,实例 intptr在 要保留的system.io.filestream类 文件句柄。

    intptr类型符合CLS, 而uintptr类型不是。只有 Intptr类型用于 语言运行时。uintptr类型为 主要用于维护 建筑对称性 类型。

    http://msdn.microsoft.com/en-us/library/system.intptr(VS.71).aspx

        7
  •  5
  •   ChrisF    16 年前

    嗯,这是 MSDN page 处理 IntPtr .

    第一行是:

    用于表示指针或句柄的平台特定类型。

    关于页面进入状态的指针或句柄:

    Intptr类型不能由 支持指针的语言,以及 作为参考数据的常用方法 在执行和不执行的语言之间 支持指针。

    Intptr对象也可用于 握住把手。例如,实例 intptr在 要保留的system.io.filestream类 文件句柄。

    指针是对存储您感兴趣的数据的内存区域的引用。

    句柄可以是对象的标识符,当双方都需要访问该对象时,在方法/类之间传递。

        8
  •  0
  •   cdiggins    7 年前

    IntPtr 是一个 value type 主要用于保存内存地址或句柄的。一 pointer 是内存地址。可以键入指针(例如 int* )或非类型化(例如 void* )一 Windows handle 通常与内存地址大小相同(或更小)的值,表示系统资源(如文件或窗口)。