Posts Tagged ‘Reading Notes’

2011/02/14

函数指针,顾名思义就是指向函数的指针,它与一般的指针有什么不同呢?我觉得,函数指针只是在定义的时候有一点不同,使用的时候,它就是一个指针该怎么用就怎么用。 int (*f)(int,double); 类似于上面的定义式就是函数指针的定义了。 从前往后分析,最前面的int 说明了这个所指向的函数的返回值,显然,这个被指向的函数会返回一个整型的值;(*f)()结构说明了这是一个函数指针,(int,double)说明了这个指针指向的函数的参数形式,即第一个参数是int型,第二个参数是double型,这时,我们脑海里可以想象有一个这样的函数 int function(int a,double b),并且有一个叫 f 的指针指向了这个函数(其实是指向了这个函数段的起始地址)。 有了前面的分析,就不难理解这个定义了 char * (*f)(double,double); 下面再来一个难一点的,int (*g[])(int ,int);首先这肯定是一个指针,但是[]怎么理解呢?按照数组的理解方法,例如int array[9]定义了一个9个元素的数组,每个元素都是int型,以此类推,这是一个函数指针数组,每一个数组元素的类型都是一个函数指针,他们都各自指向一个类似于 int func(int,int)的函数。 如何使用函数指针呢?我们知道,函数名其实就是指向函数代码段的一个指针,因此,f和function都可以看成是一个指针,都指向了内存中同一块代码段,所以,调用f(3,4.5)与function(3,4.5)是一样的,相当于是给原来的函数一个别名吧。当然,f是一个指针,理所当然可以对他进行“间接访问”,即 (*f)(3,4.5)。 一般情况下对于函数指针的常见情况也就是以上这些了,那么函数指针到底有什么用呢? >说实话,我自己写代码到目前为止还没用过函数指针,一方面是我对这个不熟悉,在coding的过程中不能灵活运用;另一方面函数指针可能确实不如其他语法常用,因此,我举一个《C和指针》中类似的例子。 例子一:不用函数指针的实现。 swith(op){ case ‘+’:add(x,y);break; case ‘-‘:sub(x,y);break; case ‘*’:mul(x,y);break; case ‘/’:div(x,y);break; } 上面的代码实现了模拟一个计算器对于x,y做加减乘除,那么用函数指针如何实现呢? 例子二:用函数指针实现。 首先我们需要声明函数,并对函数指针数组初始化。 double add(double,double); double sub(double,double); double mul(double,double); double div(double,double); /*声明函数指针数组*/   double (*op_fun[4])(double,double)={add,sub,mul,div}; 现在我们可以这样使用: result=op_fun[op](x,y); OK,以上就是鄙人学习函数指针的一点点心得。

Tags: ,,. 6,377 views
2011/01/30

Programming Pearls Second Edition Page 11 Problem C : Given a dictionary of english words,find all sets of anagrams,For instance, “posts”,”stop”and ”tops” are all anagrams of one another because each can be formed by permuting the letters of the others. 按照书上给出的解法,先对每一个单词生成相应的“签名”(“signature”),即把单词中的字母按照字母表的顺序重新排列,例如stop 重新排列成opst , 然后把有相同signature的单词归为一组输出。基本过程如下: 其中sign()函数用于生成每一个单词的”签名“,如何生成呢?由于每个单词的长度一般都很短(不超过10个字母)于是可选择用直接插入排序法。其他的数据结构和函数很简单,直接看代码吧!

Tags: . 6,425 views