通过使用智能感知,看着别人的代码,我也碰到过这样IntPtr
类型; 要利用一切已经所需要的时间我只是把null
或IntPtr.Zero
,发现大部分功能工作。 究竟是什么,当/为什么使用它?
Answer 1:
这是一个“本地(特定于平台)大小的整数。” 它的内部表示为void*
,但暴露出来的整数。 每当你需要存储一个非托管指针,不想用就可以用它unsafe
代码。 IntPtr.Zero
实际上是NULL
(空指针)。
Answer 2:
这是一个价值型大到足以存储一个内存地址为本机或不安全的代码中使用,但不能直接用于在安全存储地址托管代码。
您可以使用IntPtr.Size
找出你在32位或64位的进程是否正在运行,因为这将是4首或8个字节分别。
Answer 3:
下面是一个例子:
我正在写一个高速摄像机接口C#程序。 相机有其自己的驱动程序,可以自动获取图像并将其加载到电脑内存中的我。
所以,当我准备把最新的图像到我的程序一起工作,摄像头驱动程序为我提供了一个IntPtr到哪儿图像已经存储在物理内存中,所以我没有浪费时间/资源创建另一个内存块存储在内存中已经图像。 该IntPtr的只是表明我在图像已经是了。
Answer 4:
直接解释
一个IntPtr是一个整数 ,其大小与一指针相同。
您可以使用的IntPtr存储在非指针类型的指针值。 此功能在.NET重要的,因为使用指针是非常容易出错,因此在大多数情况下是非法的。 通过允许指针值将被存储在一个“安全”的数据类型的 , 不安全的代码段之间的管道可以以更安全的高级别代码来实现-或即使在不直接支持指针.NET语言。
IntPtr的大小是特定于平台的,但这个细节很少需要考虑,因为系统会自动使用正确的尺寸。
“IntPtr的”这个名字是混乱-像Handle
可能是更合适的。 我最初的猜测是,“IntPtr的”是一个指向整数。 该IntPtr的的MSDN文档进入晦涩的细节而没有提供有关这个名字的意义很大的启示。
另一透视
一个IntPtr
是有两个限制的指针:
- 它不能直接取消引用
- 它不知道它指向的数据类型。
换句话说,一个IntPtr
就像是一个void*
-但与额外的功能,它可以(但不应该)被用于基本指针运算。
为了取消引用一个IntPtr
,既可以将它转换为一个真正的指针(它仅可在“不安全”的上下文中执行的操作),也可以将其传递给一个辅助例程诸如由提供的那些InteropServices.Marshal
类。 使用Marshal
类对安全的错觉,因为它不要求你是一个明确的“不安全”背景下。 但是,它不会删除崩溃这是在使用指针固有的风险。
Answer 5:
什么是指针?
在所有的语言中,指针是存储内存地址的变量类型,你可以让他们告诉你他们指向的地址或在它们指向的地址的值 。
指针可以看作是一个排序的书签。 除,而不是被用来快速跳转到网页中的一本书,一个指针用于跟踪的内存或映射块。
试想一下,你的程序的内存的65535个字节恰恰就像一个巨大的阵列。
指针指向乖乖
指针记住每一个存储器地址,因此,它们的每个点以在存储器中的单个地址。
作为一个群体,指针记忆和回忆的内存地址,服从你的每一个命令广告nauseum。
你是他们的国王。
在C#指针
具体地,在C#,指针是存储0和65534之间的存储器地址的整数变量。
还专门针对C#,指针类型为int,因此签署。
不能使用负号的地址,虽然,你也不能访问上面65534地址的任何尝试都将引发System.AccessViolationException。
所谓MyPointer指针声明,如下所示:
INT * MyPointer;
在C#指针是一个整数,但在C#的存储器地址在0开始并一直延伸65534。
尖尖的东西应该有额外的特殊小心处理
不安全的词意在吓唬你,和一个很好的理由:指针是尖尖的东西,尖尖的东西,例如刀剑,斧头,指针等应当额外特别小心处理。
指针给一个系统的程序员严格控制。 因此犯了错误很可能有更严重的后果。
为了使用指针,不安全的代码在你的程序的属性启用,并且指针必须在标记为不安全的方法或块专用。
不安全的块的示例
unsafe
{
// Place code carefully and responsibly here.
}
如何使用指针
当变量或对象的声明或实例,它们存储在内存中。
- 通过使用*符号前缀声明一个指针。
int *MyPointer;
- 为了得到一个变量的地址,你可以使用&符号的前缀。
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.
}
请注意指针的类型是一个整数。 这是因为C#解释存储器地址作为整数(INT)。
为什么诠释而不是单位?
有没有很好的理由。
为什么使用指针?
指针是一个很大的乐趣。 有了这么多的计算机被控制内存,指针赋予一个程序员的程序内存的更多的控制。
内存监控。
使用指针读取的存储块和监控如何被指出在一段时间的变化值。
负责任地改变这些值并跟踪你的变化如何影响您的计算机。
Answer 6:
MSDN告诉我们:
该IntPtr的类型的设计是一个整数,其大小是特定于平台。 即,这种类型的一个实例预期是在32位的硬件和操作系统32位,和在64位硬件和操作系统64位。
所述的IntPtr类型可以由支持指针的语言被使用,并且作为和不支持指针语言之间参照数据的常用手段。
IntPtr的对象也可以用来装柄。 例如,IntPtr的实例是在System.IO.FileStream类广泛用于保存文件句柄。
该IntPtr的类型是符合CLS,而UIntPtr类型不是。 只有IntPtr的类型在公共语言运行时使用。 该UIntPtr类型主要提供以保持与IntPtr的类型建筑的对称性。
http://msdn.microsoft.com/en-us/library/system.intptr(VS.71).aspx
Answer 7:
嗯,这是MSDN页面 ,与涉及IntPtr
。
第一行写着:
时所使用的特定于平台的类型来表示的指针或把手。
至于什么指针或句柄的页面继续说:
所述的IntPtr类型可以由支持指针的语言被使用,并且作为和不支持指针语言之间参照数据的常用手段。
IntPtr的对象也可以用来装柄。 例如,IntPtr的实例是在System.IO.FileStream类广泛用于保存文件句柄。
指针是保存一些数据,你有兴趣的内存区域的引用。
手柄可以是用于一个对象的标识符和被方法/类间传递时双方都需要访问该对象。
Answer 8:
一个IntPtr
是一个值类型 ,它主要用来保存存储器地址或句柄。 甲指针是一个存储器地址。 指针可以被键入(例如int*
)或无类型(例如void*
)。 甲视窗手柄是通常具有相同的尺寸(或小于)的存储器地址和表示系统资源(如文件或窗口)的值。