C语言深度解剖(精讲版)——读书笔记22-函数指针

来源:互联网 发布:sql常用查询语句大全 编辑:程序博客网 时间:2024/06/16 06:21

第四章   指针和数组

 

这篇文章写的不好,推荐另一篇好文章地址:http://www.cnblogs.com/gmh915/archive/2010/06/11/1756067.html

函数指针

一.函数指针的定义

(按照我原来说的方法: 后面的那个词”作为主语的方法 C语言深度解剖(精讲版)——读书笔记18 &&自己的一些理解 博文有讲  ,  函数指针:即指向函数的指针

看例子:

(a)   char  *  (*fun1)(char  *p1,char  *p2);

(b)   char  * *fun2(char  *p1, char *p2);

(c)   char  *fun3 (char   *p1, char *p2);

看上面的表达式是什么意思?

(c) :fun3是函数名, 函数的返回值为char * 类型;

(b)  :与(c)相比唯一不同就是,函数的返回值为char **类型,是个二级指针;

(a) :fun1是一个指针变量,它指向一个函数。这个函数有两个指针类型的参数,函数的返回值也是一个指针 ;

 

二.函数指针的使用例子

如何来使用一个函数指针?来看下面的例子:

 

#include <stdio.h>#include <string.h>char  * fun(char * p1, char *p2){     int  i=0;     i=strcmp(p1,p2);     if(0==i)    {         retrun p1;    }    else     {         retrun   p2;    }}int  main(){     char * (*pf)(char  *p1,char  *p2);     pf=&fun;     (*pf)("aa","bb");     retrun  0;}

使用指针时,我么通过钥匙(“*”)来取其指向的内存里面的值,函数指针使用也如此。通过(*pf)取出存在这个地址上的函数,然后调用它。

【注意:给函数指针赋值时,可以用&fun或直接用函数名fun。这里以为函数名编译之后其实就是一个地址,所以这里两种用法没有本质的区别】

 

三. *(int *)&p ---这是什么?

上面的例子过于简答,我们再来看看下面的例子:

void    Function()

{

     printf("Call    Function");

}

int  main()

{

     void  (*p)();

     *(int *)&p =(int )Function;

     (*p)();

     retrun  0;

}

这是什么意思??*(int *)&p =(int )Function;  先看:

void  (*p)();    //定义了一个指针变量p,p指向了一个函数,这个函数的参数和返回值都是void;

&p  :求指针变量p本身的地址,这是一个32位的二进制常数(32位系统);

(int  *)&p :表示将地址强制转换为int 类型的数据的指针;

(int )Function  :表示将函数的入口地址强制转换成int类型的数据。

所以:*(int *)&p =(int )Function  表示将函数Function 的入口地址复制给指针变量p

(*p)() :表示对函数Function的调用 ;

其实,函数指针和普通指针没有什么区别,只是函数指针指向的内容为函数而已。。。