关于这个练习18,题本身上难度不大,有很大一部分的题目是之前的练习题中做过的(G~L题都曾经做过原题),不同的是要使用指针实现。在我看来,指针在这些题中的使用并没有体现出多大算法上的优势,要说优势则是逻辑上较为直接,可以精准输出想要输出的一维数组或二维数组中的元素,比较方便,不用在逻辑上大费周折。在某些题上,用指针可以使代码缩短将近一半,看起来很是舒服(例如K题)。缺点是可读性上比较难以理解(个人认为)。另外,对于题意及解决问题所用代码是否有意义的问题上,个人认为还是要多加注意。例如C题(指针实现三个整数排序-指针与变量)先引用一下题目:
输入三个整数,从小到大进行排序。函数接口如下: void sort3(int *p1, int *p2, int *p3)
输入描述: 三个整数(0~2^30-1),空格分隔。
输出描述: 三个整数从小到大排序,空格分隔。
我最开始写的代码是这样的:
#include<iostream> #include<cmath> using namespace std; void sort3(int *p1,int *p2,int *p3) { int a,b,c,t=0; cin>>a>>b>>c; if(a>b) { t=b; b=a; a=t; } if(a>c) { t=c; c=a; a=t; } if(b>c) { t=c; c=b; b=t; } p1=&a; p2=&b; p3=&c; cout<<*p1<<" "<<*p2<<" "<<*p3<<" "<<endl; } int main() { int *p1,*p2,*p3,a,b,c; sort3(p1,p2,p3); return 0; }这样虽然代码能够AC,但是在这里由于三个整数a,b,c已经排好序了,所以指针的使用显得多余。
将其修改后代码如下:
#include<iostream> #include<cmath> using namespace std; void sort3(int *p1,int *p2,int *p3) { int t=0; if(*p1>*p2) { t=*p2; *p2=*p1; *p1=t; } if(*p1>*p3) { t=*p3; *p3=*p1; *p1=t; } if(*p2>*p3) { t=*p3; *p3=*p2; *p2=t; } cout<<*p1<<" "<<*p2<<" "<<*p3<<" "<<endl; } int main() { int *p1,*p2,*p3,a,b,c; p1=&a; p2=&b; p3=&c; cin>>a>>b>>c; sort3(p1,p2,p3); return 0; }这样的话指针直接参与排序过程,使用指针便有了意义。
总结一下,就是指针作为C语言中的灵魂,其灵活性和普遍性是无可比拟的,通过考察一个程序员指针使用的灵活程度,就可以大致了解其编程水平,可见其重要性。