雕刻时光

just do it……nothing impossible
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

从汇编的角度分析函数指针

Posted on 2013-11-29 21:55  huhuuu  阅读(1930)  评论(2编辑  收藏  举报

可能指针函数与函数指针的概念不是很清楚

1.指针函数的概念其实跟普通函数的概率类似,就是一个函数的返回值是个指针类型!

#include<stdio.h>
#include<iostream>
using namespace std;

int *pointFun(){
    int *p=(int *)malloc(sizeof(int));
    *p=1;
    return p;
}

int main(){
    int *ptemp=pointFun();
    printf("%d\n",*ptemp);
}

2.函数指针还是比较有来头的

观察以下函数

#include<stdio.h>
#include<iostream>
using namespace std;

void myfun(int x){
    printf("%d\n",x);
}

void (*fun)(int);
void (*fun2)(int);

int main(){

    (*myfun)(10);
    myfun(19);
    (&myfun)(190);

    fun=&myfun;
    (*fun)(123);
    fun(1234);
    //(&fun)(1234);

    fun2=myfun;
    fun2(456);
    (*fun2)(4567);
}

如果以前没注意的话,会不会有毁三观的赶脚 = =

看一看内存中的情况

发现*myfun,&myfun,myfun都指了同一个地方

 

 

其实:(参考http://hi.baidu.com/bellgrade/blog/item/229f792d39e0a5e68a1399f3.html

1. 其实,MyFun的函数名与FunP函数指针都是一样的,即都是函数指针。MyFun函数名是一个函数指针常量,而FunP是一个函数数指针变量,这是它们的关系。
2. 但函数名调用如果都得如(*MyFun)(10);这样,那书写与读起来都是不方便和不习惯的。所以C语言的设计者们才会设计成又可允许MyFun(10);这种形式地调用(这样方便多了并与数学中的函数形式一样,不是吗?)。
3. 为统一起见,FunP函数指针变量也可以FunP(10)的形式来调用。
4. 赋值时,即可FunP=&MyFun形式,也可FunP=MyFun。

3.函数指针的用途:

 既然函数指针变量是一个变量,当然也可以作为某个函数的参数来使用的。所以,你还应知道函数指针是如何作为某个函数的参数来传递使用的。

 即函数可以作为参数传递。

#include<stdio.h>
#include<string.h>

void MyFun1(int x);  
void MyFun2(int x);  
void MyFun3(int x);  
typedef void (*FunType)(int ); //②. 定义一个函数指针类型FunType,与①函数类型一至
void CallMyFun(FunType fp,int x);

int main(int argc, char* argv[])
{
    CallMyFun(MyFun1,10);    //⑤. 通过CallMyFun函数分别调用三个不同的函数
    CallMyFun(MyFun2,20);   
    CallMyFun(MyFun3,30);   
}
void CallMyFun(FunType fp,int x) //③. 参数fp的类型是FunType。
{
    fp(x);//④. 通过fp的指针执行传递进来的函数,注意fp所指的函数是有一个参数的
}
void MyFun1(int x) // ①. 这是个有一个参数的函数,以下两个函数也相同
{
    printf("函数MyFun1中输出:%d\n",x);
}
void MyFun2(int x)  
{
    printf("函数MyFun2中输出:%d\n",x);
}
void MyFun3(int x)  
{
    printf("函数MyFun3中输出:%d\n",x);
}

在第一次

在fp寻找函数的时候,在汇编的指令里跳转到了myFun1的函数地址