- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
指针仅仅是作为指针,我们可以把它当做有用的工具,为我们提供便利与好处。说起工具不得不让我想起一样东西——锄头,因为原人类有了锄头才使人类文明进入了开荒造田的农业时代,解决了温饱,开启了人类新纪元。可以这么说吧锄头使人类文明得到进步,没有锄头也就没有今天的我们,其地位与重要性可想而知。那么我们的指针何以能发挥像锄头那样惊人的魅力呢?
?
魅力1 算法之找我的名字——简单,灵活,快捷
以下算法功能是在一个字符串中查找长度为8的一个字符子串,比如我的名字“ZhanHang”就是一个8长度的字串。算法解释:因为字串myname的长度为8,也就是它是一个8字节的内存连续的数组,而myname指向这一段内存。又Long long 指针类型是一个指向8字节内存的类型,因此就可以将myname转换成long long 类型指针,如此在进行子串的比较时,就可以直接比较两个long long 类型的变量即可,免去了对子串进行遍历的麻烦。详情请看代码。
[cpp]?view plaincopy
#include?stdio.h??
??
int?find_my_name(const?char*?str,?int?str_len,?const?char*?myname)??
{??
????long?long?*pkey?=?(long?long*)myname;??
????long?long?*curr_str?=?NULL;??
????str_len?=?str_len?-?sizeof(long?long);?//此处是为了for循环作的优化处理,因为后面7个字符不需要遍历检测了??
????for(int?i=0;?i=str_len;?i++)??
????{??
????????curr_str?=?(long?long*)str[i];?//得到一个新的子串??
????????if(?*pkey?==??*curr_str?)?//判断两个字串是否相等??
????????????return?i+1;??//返回子串在字串中的位置??
????}??
}??
/**?
Author:花心龟?
Blog:/zhanxinhang?
**/???
int?main()??
{??
????char?str[]=alZhanhangadf;??
????char?myname[]=Zhanhang;??
????printf(my?name?at?%d\n,find_my_name(str,sizeof(str)/sizeof(char),myname));//输出结果是3??
??????
????return?0;??
}??
小结:指针实际上指向一内存空间,其内存空间的大小由指针类型而定。灵活的应用指针是能够为编程带来便利的。
(题外语:作者使用此实例旨在通过灵活应用指针的例子,帮助理解指针,并通过理解指针作为本文介绍指针魅力的起点,实际工程中并不赞同此方法,因为本方法存在扩展性差,移植性差等问题。)
魅力2 迭代器——高效
“迭代”一词在汉语里面是“更替”的意思,也就是说“迭代器”的意思就是指用来做更替操作的工具。实例:实现算法使一个字符串颠倒顺序,实现步骤:构建两个迭代器p 和 q ,在一次遍历中,p的位置从字串开头向中间不断更替,q从字串末尾向中间不断更替,
然后每次交换p和q所指向的内容即可,直到p和q在中间相遇,这时循环次数刚好等于字串的长度_l/2。
实现代码:
[cpp]?view plaincopy
void?reverse(char?*_str,int?_l)?//反转函数,_l指要反转字串的长度??
{??
?char?*p=_str,*q=_str+_l-1,temp;??
??
?while(qp)??
???{???
?????temp=*p;??
?????*p=*q;??
?????*q=temp;??
???
?????p++;??
?????q--;??
???}??
}??
我若不用迭代器p和q呢?用两个变量i和j作为str的下标,也就是说访问元素的方式变为:str[i],str[j],如下
[cpp]?view plaincopy
void?reverse(char?*_str,int?_l)?//反转函数,_l指要反转字串的长度??
{??
??int?i=0,j=_l-1,temp;??
???
?while(ji)??
???{???
?????temp=str[i];??
?????str[i]=str[j];??
?????str[j]=str[i];??
???
?????i++;??
?????j--;??????
???}??
}??
这样并不比上面用迭代器的情况好,而且要糟
文档评论(0)