指针与C中的句柄(用于传达单独事物的术语?)

时间:2009-12-17 18:16:23

标签: c windows pointers handle

最近,我读了一篇个人的白皮书,他将一个指向结构的指针作为句柄。作者显然是以前在Windows平台上编写过C代码的人。谷歌搜索表明Windows程序员通过句柄与系统组件交互。我想知道Windows程序员是否通常将所有结构指针都称为句柄?或者术语句柄是否意味着传达超出指针结构的东西?我问的是Linux C程序员。

我指的白皮书是: Duff,Heroux和Pozo。稀疏基本线性代数子程序概述:BLAS技术论坛的新标准。 ACM Transactions on Mathematical Software,Vol 28,No。2,June 2002,Pages 239-267。

16 个答案:

答案 0 :(得分:43)

术语句柄通常表示一些不透明值,它仅对生成它的API有意义。在Win32中,HANDLE类型是内核内存中的指针(应用程序无法访问)或者是某些内核内部数组的索引。

答案 1 :(得分:17)

手柄是一个古老而受人尊敬的概念。

一个cookie是完全相同的。或GUID。或者是从停车场取回汽车的车票,或者从高档餐厅取回你的外套等等。

当发回给发行人时,它的任何独特价值都可用于跟踪发行人想要的任何不透明机制所引用的实际内容。您可能会或可能不知道任何相关信息。过程,也不是基本的东西,确切地说(仅在概念上)。

Windows大量使用它,但它肯定不是Windows独有的。

通常不会使用“handle”来表示“指向struct的指针”。句柄更像是“令牌”,而不像“指针”。它指的是某些东西 - 文件,系统资源,内存,状态快照等。但究竟是什么基于句柄本身的上下文(即谁发出句柄)。

在K& R C的早期文件系统编程中也大量使用句柄。

答案 2 :(得分:12)

我使用单词handle表示指向表示资源的“对象”的指针 - 通常是OS资源,而指针只指向某个内存。如果你有一个东西的句柄,你不应该尝试直接读取和写入字节,而是通过提供的方法对其进行操作。

通常句柄被实现为不透明void *,这进一步鼓励不要尝试直接取消引用它。

答案 3 :(得分:10)

由于您将句柄用作指向结构的指针,如Windows程序员所使用的,我将在该上下文中回答。请注意,显然有许多不同类型的“句柄”,因为它是在计算环境中广泛使用的通用概念。当然你会熟悉文件句柄的概念; Windows还提供窗口句柄和许多其他类型的句柄。话虽如此:

“内存句柄”(类似于指向结构的指针)是16位Windows编程的概念,其中CPU中没有内存管理器,所有内存管理都必须在软件。本质上,“句柄”是一种指针,但操作系统可以随意移动句柄所指的内存。您不能使用常规指针执行此操作,但句柄具有可以获取和释放实际内存地址的函数。

随着Win32的推出,CPU拥有硬件内存管理器,内存句柄的概念已经过时。其他类型的句柄(如文件句柄和窗口句柄)仍然存在于Win32中,但不是指向结构的指针。

答案 4 :(得分:3)

术语句柄用于表示允许您访问另一个对象的任何技术。句柄可以是指针,引用,指针指针等。但是确定它与类,对象等有关。因此句柄不必总是指向结构的指针。

-AD。

答案 5 :(得分:3)

术语“句柄”并没有在Windows上出现,尽管它在Windows程序员中很普遍。

在C标准库(stdio.h)中,文件句柄是指向C库使用的数据结构的指针。

纯Unix编程使用文件描述符,它们是内核数据结构的索引,但指针在Unix中已被用作句柄超过30年。

答案 6 :(得分:3)

“处理”是一个逻辑术语,而不是物理术语。它意味着作为物理对象的代理,以便对对象有更深入的了解。指向结构的指针是一个这样的代理,但还有许多其他的可能性。

答案 7 :(得分:2)

不,在Windows程序员中将指针称为句柄并不是特别常见,但这样做也不是错误的。术语“句柄”通常用于描述您用来访问某些东西的东西,从这个意义上讲,它都是指针句柄(但并非所有句柄都是指针)。 Win32的句柄通常不是AFAIK指针,而是指向内部OS表的索引 - 但在未来的Windows版本中这可能会改变。

答案 8 :(得分:2)

在MacOS编程的旧时代,在OSX之前,句柄是指向指针的指针。这允许操作系统在不使用户指针无效的情况下移动操作系统。我们可以假设指向的物体不会移动的规则,我不记得了。

答案 9 :(得分:2)

句柄是对象的引用(不是特定的C ++引用)的通用术语。

指针句柄的子集,因为它指向对象。

数据库中的外键也是句柄,因为它指向其他表中的记录;它不是指针。

在Windows API环境中,他们使用抽象术语 handle ,因此他们可以将整数用于表,指针或其他方法,而不会干扰客户端; IOW,定义一个抽象接口。

总之,句柄可以是指针之外的其他东西,例如整数索引或包含有关对象的更多详细信息的对象(例如智能指针)。

答案 10 :(得分:1)

Windows定义了很多东西的句柄。它们根本不是指针 - 有些是指针,但是其他指针就像偏移到特定表格中一样。有些是故意混淆的。从窗口到设备上下文到位图等都有句柄,等等。

在任何情况下,句柄通常都是作为不透明的数据类型 - 即您不应该对其值有任何了解,只能使用一组预定义的操作来完成各种任务。我相信C ++ / CLI也有一个类似指针的对象,称为句柄。我相信它应该更接近不透明的数据类型 - 如果内存服务,你允许对它们进行任何指针运算。

答案 11 :(得分:1)

句柄通常是您不需要解除引用的指针。而是将它们传递给对底层结构进行操作的API调用。

历史上在Windows上,句柄不是指针。您可以在使用之前锁定句柄以获取指针,并在完成后将其解锁(并且指针将变为无效)。在分页内存之前的几天,老式Windows通过交换仅由句柄引用的资源并在锁定时将它们交换回来进行自己的内存管理。实际上,这使得内存管理成为一场噩梦,但允许Windows在没有硬件支持的情况下模拟系统上的虚拟内存。

答案 12 :(得分:0)

指针肯定与句柄不同。指针是内存中未指定的内容的地址。指向结构的指针可以称为“句柄”(通常使用'typedef')。

句柄是用于编写Windows操作系统的概念。 指针是C语言的一部分。

答案 13 :(得分:0)

我可能比大多数受访者年龄大,他们在早期(80年代后期)的Macintosh以及16位和32位Windows上都使用C语言进行了编码。在那些远古时代(当IBM大型机可能只有256k内存时)句柄始终是指向内存指针的指针(或表偏移)。

正如之前的一位受访者所提到的,它允许操作系统管理指向内存块的指针表,而不会使程序员使用的“句柄”无效。不幸的是,我不记得在使用句柄时我们如何保证不会移动已分配的块。

答案 14 :(得分:0)

实际上指针是一个变量,它包含另一个变量的地址,但是句柄是指向指针的指针,即包含另一个指针的地址的指针 FOR EX:

int x=10;

int *a=&x;// this is a simple pointer

int *b=a;// this is a handle

答案 15 :(得分:0)

<块引用>

句柄是数字,指针不是句柄

// storage
char data[0xFFFF] = {0} ;

// pointer aka "iterator"
char * storage_pointer = & data[42];

// handle
size_t storage_handle = 42 ;

关键区别或者如果您更喜欢将其称为句柄的“优势”,则可以尝试推断句柄是否有效,或者您是否更喜欢术语“悬空”。

I do use handles 只要可行。 Here is a good article 关于优势和实施实践。