最近,我读了一篇个人的白皮书,他将一个指向结构的指针作为句柄.作者显然是以前在Windows平台上编写过C代码的人.谷歌搜索表明Windows程序员通过句柄与系统组件交互.我想知道Windows程序员是否通常将所有结构指针都称为句柄?或者术语句柄是否意味着传达超出指针结构的东西?我问作为Linux C程序员.
我指的白皮书是:Duff,Heroux和Pozo.稀疏基本线性代数子程序概述:BLAS技术论坛的新标准.ACM Transactions on Mathematical Software,Vol 28,No.2,June 2002,Pages 239-267.
句柄如何与指向对象的指针不同,以及为什么我们不能引用引用?
我不能说我有强大的C++背景,所以这些天我经常听到Handle.我知道Pointer是什么(它存储内存位置的地址就像参考),但我不确定Handle是什么以及这两者之间的区别.如果你能提供一个C#中的示例代码就会很棒.
顺便说一下,我用Google搜索了这个术语,然而很多人给出了不同的解释,所以我觉得我从SO中得到了最好的解释.
编辑:
为其他访客快速提醒:句柄就像是指向资源的参考.它可以指向像指针一样的内存地址,但Handle是更通用的术语,所以它更像是一个伪指针.文件就是一个很好的例子.文件可以具有操作系统可以理解并用于查找文件的ID.因此Handle可以保存此ID(可能是也可能不是内存地址),当我们通过此Handle时,OS可以轻松找到该文件.
有关更多详细信息,请参阅以下答案.
编辑:
这个问题下的所有答案都很棒,很有说服力.我很难选择其中一个来标记它作为答案.
我经常听说过"手柄",究竟是什么?
编辑:例如我听说过:windows处理事件处理文件句柄
等等.那些东西是一样的吗?或者他们是一些抽象的术语?
因此,我正在阅读有关C 语言句柄的文章,并意识到我们将句柄实现为 void 指针,因此我们获得的“任何”对象/数据类型都可以将 void 指针转换为该类型的对象/数据并获取其值。所以我基本上有两个担忧:
1.如果让我们说下面的例子取自C中的Handle
typedef void* HANDLE;
int doSomething(HANDLE s, int a, int b) {
Something* something = reinterpret_cast<Something*>(s);
return something->doit(a, b);
}
Run Code Online (Sandbox Code Playgroud)
如果我们将值传递给函数dosomething(21,2,2),这是否意味着 HANDLE 指向的值是 21,如果是的话,当我们键入时,任何对象如何将其转换为该对象,它是否能够使用它,就像在这个例子中一样,所以在换句话说,指向对象 Something 的指针something将在哪里存储值 21。
2.其次,该链接还显示“因此,在您的代码中,您只需将 HANDLE 作为不透明值传递”,这实际上是什么意思?为什么我们要“传递句柄”?如果有人能给出更有说服力的使用对象的句柄示例,那就太好了!