句柄:以下内容来自百度百科:

句柄(handle),有多种意义,其中第一种是指程序设计,第二种是指Windows编程。现在大部分都是指程序设计/程序开发这类。
第一种解释:
句柄是一种特殊的智能指针 。当一个应用程序要引用其他系统(如数据库、操作系统)所管理的内存块或对象时,就要使用句柄。

第二种解释:
整个Windows编程的基础。一个句柄是指使用的一个唯一的整数值,即一个4字节(64位程序中为8字节)长的数值,来标识应用程序中的不同对象和同类中的不同的实例,诸如,一个窗口,按钮,图标,滚动条,输出设备,控件或者文件等。应用程序能够通过句柄访问相应的对象的信息,但是句柄不是指针,程序不能利用句柄来直接阅读文件中的信息。如果句柄不在I/O文件中,它是毫无用处的。 句柄是Windows用来标志应用程序中建立的或是使用的唯一整数,Windows大量使用了句柄来标识对象。

我想读到这里大家可能会有种似懂非懂的感觉吧,也难怪。这种概念性的问题理解起来真的是很抽象了,我也深受其害o(╥﹏╥)o,不过今天我就帮大家干掉这个Problem—“句柄”

举个例子:
大家学习linux中系统编程方面的“进程间通信”的时候,都会发现在创建时候的接口的第一个参数都是一个“key值”:

#include <sys/ipc.h>
#include <sys/msg.h>
int msgget(key_t key, int msgflg);
例:msgget(key,IPC_CREAT|0666)
参数:
key:消息队列关联的键。
msgflg:消息队列的建立标志和存取权限。
IPC_CREAT如果内核中没有此队列,则创建它。
IPC_EXCL当和IPC_CREAT一起使用时,如果队列已经存在,则失败。

我们可以这么理解:当我们向操作系统申请到了相应的内存空间的时候,那么势必要做的一件事就是要将它管理起来,那么我们就应该对其作出标记。那么这个key就相当于是得到一个句柄,句柄是一种特殊的智能指针 。当一个应用程序要引用其他系统(如数据库、操作系统)所管理的内存块或对象时,就要使用句柄。 所以,我们可以这样理解句柄:

数值上,是一个32位无符号整型值(32位系统下);
逻辑上,相当于指针的指针;
形象理解上,是Windows中各个对象的一个唯一的、固定不变的ID;
作用上,(Windows)使用句柄来标识诸如窗口、位图、画笔等对象,并通过句柄找到这些对象。

再了解一下,句柄的相关特性:

1 唯一性:是指在程序的一次运行中。如果本次运行完,关闭程序,再次启动程序运行,那么这次运行中,同一对象的句柄的值和上次运行时比较,一般是不一样的。

2.句柄是对象生成时系统指定的,属性是只读的,程序员不能修改句柄。

3.不同的系统中,句柄的大小(字节数)是不同的,可以使用sizeof()来计算句柄的大小。

4.通过句柄,程序员只能调用系统提供的服务(即API调用),不能像使用指针那样,做其它的事。

5.句柄与普通指针的区别在于:指针包含的是引用对象的内存地址,而句柄则是由系统所管理的引用标识,该标识可以被系统重新定位到一个内存地址上。这种间接访问对象的模式增强了系统对引用对象的控制。

Logo

更多推荐