第四章 指针和数组
这篇文章写的不好,推荐另一篇好文章地址: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的调用 ;
其实,函数指针和普通指针没有什么区别,只是函数指针指向的内容为函数而已。。。