快速业务通道

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

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-30
是“原始手段”,指针是引用,而“高级手段”则是取内容(通过取内容操作符“*”将指针类型换成地址类型以实现)。应注意引用也可以不使用取内容这个“高级手段”,其他的也可以,但需要保证此“高级手段”能控制(或执行)“原始手段”——数字的计算(即C++语法中所有可以放表达式的地方,指针类型转地址类型正好是通过操作符的形式实现,即可放于表达式中而达到执行“原始手段”的目的),如类型转换。现已了解指针所引入的间接,下面就来看如何运用这个间接。

“高级手段”取内容有什么方面比“原始手段”计算数字优越呢?取内容具有一个唯一的可配置信息——取内容的位置,即地址。前面已说,“高级手段”的可配置带来灵活性,如下:long a1 = 1, a2 = 2, a3 = 3, *p = 0; /* 一些操作以决定p的值 */ *p += 5;上面的灵活性体现在多次执行*p += 5;这条语句,可能会将不同内存中的值增5.但如果a2 += 5;,则无论执行多少遍都是将a2对应的地址所标识的内存中的值增5.之所以能这样是因为指针是地址类型的数字的引用。

应注意地址类型也带入一个间接,其是数字的引用。数字的计算是“原始计算”,取内容是“高级手段”(感觉和指针一样,但后者需要取内容操作符的转换,而前者不用),地址类型的数字就是引用。这也就导致a3 = a1 + a1;也具有灵活性,因为不是a3 = 1 + 1;,而是由地址间接获得long类型的数字。对于a3 = *p + *p;则先间接获得地址,再间接获得放在内存中的数字,这是一个二级间接,其灵活性要高于a3 = a1 + a1;,因此指针也可以说是一个数字的引用。

前面提到的间接的简化操作等功用,由于需要“高级手段”的支持,而这里一般性的只有取内容操作符,故指针主要用于增加灵活性。

注意引用一般是一个较小的资源,易于记录才会被视为引用。如只用将B的手机号码给A而不用将B带到A面前就可以实现A和B谈话。当引用的是对某种资源的操作时,给出较小的引用的代价要小于给出那种资源的一个实例,此时传递引用就比传递那种资源的实例更有效率,此即前面所谓的提高效率。这在C++中非常流行,这完全依赖于指针的二级间接以实现对数字的引用。即一个数字很大,如长度300字节(如类型为char[300]),而其引用——地址——只有4个字节,故欲将其传递给函数时应传递地址,而指针类型的数字就是地址,故函数的参数类型应是指针(char(*)[300])而不是原类型(char[300]),后者的传递费用更高。

指针的运用——间接

至此,根据上面已经可以得出指针的四个运用目的了——增加灵活性、引用内存块、引用数字、语义需要,分述如下:增加灵活性  编写一段代码时,尤其是循环,循环体中是经常使用指针的地方,因为之所以能体现灵活性,就是相同的做法得到不同的结果,也因此多次循环执行相同的循环体却得到不同的结果以达到简化程序编写的目的(否则需对每种结果书写一段代码)。如需增加100个分散的等间隔20字节的内存块中的值,则可将第一个地址放在一个指针中,如下:long *p; /* 初始化p */ for( long i = 0; i < 100; i++, p += 5 ) *p++;因此对于不想或不能改变代码的地方,为了增大其适用范围,常利用指针来增加其灵活性。如函数体内、库文件内(如动态连接库)、模块内(指程序结构上,如游戏逻辑计算模块和绘图模块)等。

注意函数指针的存在。函数的一个原型代表了一种调用规则,即《C++从零开始(十八)》中说的接口,则函数指针是一个接口的引用,则两个模块(或称组件)之间衔接时,如逻辑计算

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号