快速业务通道

C++从零开始之指针及其语义和运用

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-30
,应小心确定参数类型是否应为指针类型(注意对于对外的接口,即使写成bool GetMaxAndMin( const long(*)[10], long*, long* );也是毫无意义的)。

语义需要  指针的语义是引用,当逻辑上需要引用时就使用指针来映射,如链表的结点中有个对下一个结点的引用,因此设计链表的结点时其就应该有一个指针类型的成员。

对于函数指针,函数就是一段程序,程序即方法的描述,即函数指针是方法的引用。如一个容器类具有一个排序方法的引用,这样使用它时给出不同的排序方法就能实现不同的排序(这是“间接”的增加灵活性的表现),因此那个容器类应有一个成员变量是函数指针类型。

有,函数指针可实现回调。如搜索数据时,通过调用函数Search,其有一个参数以指明当搜索时间超时时应怎么办,所以Search需要一个函数的引用(代码不能传递),也就是函数指针,如下:

 bool bContinue( unsigned long overSeconds )
    {
        if( /* 判断是否继续 */ )
        { /* 必要的处理 */ return true; }
        return false;
    }
    bool Search( bool(*)( unsigned long ), /* 其它参数 */ );
    Search( &bContinue, /* 其它参数 */ );

上面的Search中就可以每隔一定时间就调用bContinue以询问是否还要继续搜寻以给出一种手段来终止过长时间的搜索。

对于成员指针,同样,是对成员的引用。在《C++从零开始(十二)》中已说明,成员变量就是相应资源的属性和状态,成员函数就是相应资源的功能,则成员指针就是资源的属性和状态的引用以及资源功能的引用。如狗具有走钢丝、跳火圈、倒立三个功能,有一个方法是马戏表演。为了增加灵活性,马戏表演这个函数中就应该保持一个对狗的功能的引用,以不同的场次表演不同的马戏。

从上可以看出,所谓语义需要,应是根据前面所说的间接的好处来设计算法,再从语义上表现出对引用的需要。但间接也有坏处,即它可能失败,而直接就总是能成功。“原始手段”一定成功(因为是直接达到目的,如果是在多级间接中则要考虑其有效性),失败是因为“高级手段”控制失败。而“高级手段”之所以控制失败是因为其配置信息无效,也就是引用是无效的。对于指针,则需要保证其值是有效的,一旦无效,将可能引起内存访问违规。如果没有适当处理措施,则程序可能崩溃。因此大多在使用指针前先检测其有效性,检测的方法就是判断其所引用的地址所标识的内存当前是否可访问(操作系统一般都提供了这样的接口),但借助操作系统效率较低,一般认为只要不为零就是有效的,因此一般如下:

if( p ) { /* 使用指针p */ }

所以一般都将指针初始化为0,如long *p = 0;。对此一般都会建立一个宏或常量来表现这个语义,在MFC中,就定义了NULL这个宏以代表0,则就可以:long *p = NULL;,NULL表示空。

至此已说明了指针及其运用,指针的运用是建立在间接的基础上的,明确了间接的优点和缺点将有助于更好地运用指针。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号