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


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

    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
    ",*ptemp);
    }

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

    观察以下函数

    #include<stdio.h>
    #include<iostream>
    using namespace std;
    
    void myfun(int x){
        printf("%d
    ",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
    ",x);
    }
    void MyFun2(int x)  
    {
        printf("函数MyFun2中输出:%d
    ",x);
    }
    void MyFun3(int x)  
    {
        printf("函数MyFun3中输出:%d
    ",x);
    }

    在第一次

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

  • 相关阅读:
    POJ 1981 最大点覆盖问题(极角排序)
    POJ 1286 Pólya定理
    POJ 1830 高斯消元
    HDU 3364 高斯消元
    Educational Codeforces Round 42D. Merge Equals(STL)
    ZOJ 3955:Saddle Point(思维)
    POJ 3301:Texas Trip(计算几何+三分)
    SCUT 125 :笔芯回文(DP)
    ZOJ 3953:Intervals(优先队列+思维)
    Codeforces Gym101097I:Sticks (思维)
  • 原文地址:https://www.cnblogs.com/huhuuu/p/3450365.html
Copyright © 2020-2023  润新知