从反转字符串中看指针魅力
从开学到现在半个学期过去了(╯‵□′)╯︵┻━┻,我们C语言的学习也进入了一个“学到了指针”的阶段(╯‵□′)╯︵┻━┻。
虽然指针这章内容较抽象,我们在感叹指针真是个磨人的小妖精之余,也不能否认指针的魅力所在,由于计算机的硬件指令很大程度上要依赖地址,所以指针提供的就是一种类似于计算机底层的表达方式来使程序猿们更加愉快高效地撸代码。
让我们先从反转字符串这个程序里了解一下指针提供的便利:
实例:实现算法使一个字符串颠倒顺序,实现步骤:构建两个迭代器p 和 q ,在一次遍历中,p的位置从字串开头向中间不断更替,q从字串末尾向中间不断更替,然后每次交换p和q所指向的内容即可,直到p和q在中间相遇,这时循环次数刚好等于字串的长度_l/2。(“迭代”,即更替,也就是说“迭代器”的意思就是指用来做更替操作的工具)
实现代码段如下所示:
1. void reverse(char *_str,int _l) //反转函数,_l指要反转字串的长度
2. {
3. char *p=_str,*q=_str+_l-1,temp;
4.
5. while(q>p)
6. {
7. temp=*p;
8. *p=*q;
9. *q=temp;
10.
11. p++;
12. q--;
13. }
14. }
可是我们都知道,这种思路用数组也是可以实现的:
1. void reverse(char *_str,int _l) //反转函数,_l指要反转字串的长度
2. {
3. int i=0,j=_l-1,temp;
4.
5. while(j>i)
6. {
7. temp=str[i];
8. str[i]=str[j];
9. str[j]=str[i];
10.
11. i++;
12. j--;
13. }
14. }
这样并不比上面用迭代器的情况好,而且要糟很多,因为这样用str[i],str[j]的下标的方式访问元素时,需要先对str所存的数组首地址进行一次加减运算才能正确得到第i个、第j个值(读者可在任何一款编译器上进行反汇编查看),上面一共出现了5次下标访问str元素,情况可想而知。
小结:指针的魅力在于它给我们提供了一种从根本上解决问题的方式,可以让我们在用指针撸代码的时候体会到森森的釜底抽薪的快感。
(以上部分内容来源于优快云论坛和《C Primer Plus》)