进一步探讨指向指针的指针
指针的指针使用过多会使程序变得庞大,变得难以维护。但指针的指针在如链表的插入操作中,又是必须的;
综上所述在不需要使用指针的指针的地方就尽量不要使用。
高级声明
int f; int *f; int *f,g;
int f(); int *f();/*()的优先级大于* ,所以这里指函数f的返回值为int * */ int (*f)(); /*f是一个函数指针,其返回值为int */
int f[]; int *f[] /*下标的优先级更高,所以f是一个数组,数组元素为int * */
int (*f[])();f首先是一个数组,数组元素是一个指针,这个指针是函数指针类型
函数指针
回调函数
最常用的应用场景,当你需要在一个链表里查找某个值时,如果是数字字符是否相等用==就好了,如果是字符串的话就需要使用另外的比较方式。所以为了完成查找这个值得在函数中考虑不同的值类型。一种较好的方法是,我们在链表中查找某个值的函数定义的参数中声明一个函数指针(不同的值就传不同的比较函数)。然后值的参数类型用void *,因为值有很多中,这样不同的值类型都可以用这同一个链表差值的函数,只是给它传递不同比较函数即可。
转移表
类似这样的场景可以用转移表。当考虑多种情况,分情况选择不同的处理。最常采用的方法是使用switch结构,但如果情况多了的话,switch会显得异常臃肿。我们可以采用转移表的方法来解决这个问题,不同的处理我们用不同的函数,然后声明一个函数指针,不同的情况对应不同的下标,然后分别调用相应的处理函数即可。
命令行参数
字符串常量
下面两个小例子用到了这个知识