C和指针13章 高级指针话题
本章的东西比较少,主要是关于指针的高级应用.对于指针的应用有一点就必须要注意了.运算符的顺序,比如怎么写是指针数组,怎么写是指向数组的指针.
1.int f();//一个函数,返回值是int
int (f)();//一个函数指针,指向一个返回值是int的函数.注意这里我省略了参数
int (f)();//一个函数指针,指向的函数的返回值是int
对于这些可以这么理解,int (f)();把f看成一个整体,是个函数,然后f就变成了指向这个整体的一个指针.
int (f[])();//f是一个数组,数组的每个元素是一个指针类型,指针指向返回值是int 的函数
在Unix系统中,可以用cdecl程序来帮助你解释这些声明.
2.函数指针的两个应用:I.回调函数,大致模板如下:int fun(int a,int (com)(void const a,void const b));这里的com就是一个回调函数,也就是用户需要用fun函数的时候,需要传一个函数的指针过来,而指向的这个函数是由用户来编写的.这里可以参照qsort的cmp函数.
什么时候用回调函数:编写的函数必须能够在不同的时候执行不同类型的工作或者执行只能由函数调用者定义的工作,你都可以使用这个技巧。
注意:回调函数传过来的是一个函数指针,而不是函数本身.这个函数参数必须是void const .在函数里面你必须保证转换成正确的类型.如果想和系统的一些函数保持兼容的话,那么相等返回0.不相等返回1.这个主要好似字符串的时候,这样可以表示3种情况.0:相等,-1:第一个小.1(或者只是一个大于0的书):第一个大.
II.转移表:就是一个数组的每个元素都是函数指针.然后通过下标来访问对应的函数.double (oper_func [])(double,double)={add,sub,mul,div};
转移表要非常注意下标的溢出,一点溢出就可能非常难于调试.
3.main函数的两个参数.这个没什么讲的,argc表示参数个数,argv是参数指针.argv的第一个是文件名.
4.字符串常量,是一个指针常量.”abc”[2]的值是’c’.这里的[2]可以看成是指针+2.这样就很好理解了,下面的函数打印出的’‘随n的不同而不同
void mystery(int n)
{//n有范围限制
n += 5;
n /= 10;
printf(“%s\n”,”**“+10-n);
}
本章编程提示总结:
1.如果并非必要,避免使用多层间接访问
2.cdecl程序可以帮助你分析复杂的声明
3.把void *强制转换为其他类型的指针时必须小心
4.使用转移表时,应该始终验证下标的有效性.[可以在调用函数的开始和结束输出一些有意义的话语]
5.破坏性的命令行参数处理方式使你以后无法再次进行处理
6.不寻常的代码始终应该加上一条注释,描述它的目的和原理