关于这个练习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语言中的灵魂,其灵活性和普遍性是无可比拟的,通过考察一个程序员指针使用的灵活程度,就可以大致了解其编程水平,可见其重要性。