精华内容
下载资源
问答
  • C语言 函数指针

    2016-04-02 15:02:20
    c语言 函数指针

    浏览博客时看到这样一个函数,linux下的signal 函数:void ( *signal( int sig, void (* handler)( int )))( int );

    虽说学过C语言但是看不懂啊!没学明白。研究了一下,记录下来吧。

    一、定义函数指针

    return_type (*func_pointer)(parameter_list)

    普通指针变量的定义

    int * p;

    char * pointer;

    类型的限定都在变量前面;

    函数指针类型的限定是前后都有,前面是返回类型,后面是输入参数。


    利用typedef 可以简化上面的表达方式。

    typedef return_type (*FunctionPointer) (parameter_list);

    FunctionPointer func_pointer;

    这样是不是容易读了,和上面的功能一样,定义了一个返回类型为return_type ,输入参数为parameter_list的函数指针。

    二、定义返回函数指针的函数

    return_type(*function(func_parameter_list))(parameter_list)


    方框圈出来的表示返回类型为函数指针,剩下的部分就表示一个function函数,输入参数为func_parameter_list。

    它就等价于 FunctionPointer function(func_parameter_list); 。

    再看看:void ( *signal( int sig, void (* handler)( int )))( int );


    signal是一个返回函数指针的函数,signal的输入为int 变量和一个函数指针。

    三、函数指针的使用

    #include <stdio.h>
    int add(int a, int b);
    void main()
    {
    	int(*fun1)(int a, int b) = add;
    	int(*fun2)(int a, int b) = &add;
    	int(*fun3)(int a, int b) = *add;
    
    	printf("%d\n", fun1(1, 2));
    	printf("%d\n", fun2(1, 2));
    	printf("%d\n", fun3(1, 2));
    
    	char input[10];
    	gets(input);
    }
    int add(int a, int b)
    {
    	return a + b;
    }
    函数名会被隐式的转变为指针,前面加*和&操作符都不起作用,printf的结果都是3。
    四、神奇的代码

    int (*(*pf())())()
    {
        return nullptr; 
    }
    哇哦,这是个什么函数!画个框框分解它


    小框表示返回的是一个函数指针,在圈个大框,又是一个函数指针。

    它就表示,pf() 返回的是一个函数指针,这个函数指针对应一个无输入参数的函数:返回值也是函数指针(对应无输入参数的函数,返回值为int类型)。好复杂啊,有点晕!

    利用typedef 简化一下。

    typedef int(*Fun1) ();
    typedef Fun1(*Fun2) ();
    Fun2 pf()
    {
         return nullptr;
    }
    这样看就舒服多了。

    五、这又是什么鬼!

    (*(void(*) ())0)();

    画个框看看:

    小框里代表一个函数指针,常数前面加括号代表类型的强制转换。咦,它把0强制转换成了一个函数指针,并执行!这是什么操作啊!

    六、一段验证代码

    #include <stdio.h>
    typedef int Function(int, int);
    typedef int(*FunctionPointer1) (int, int);
    typedef FunctionPointer1(*FunctionPointer2) ();
    int fun1(int a, int b)
    {
    	return a + b;
    }
    
    FunctionPointer1 fun2()
    {
    	return fun1;
    }
    FunctionPointer2 fun3()
    {
    	return fun2;
    }
    int(*(*fun4())())(int, int)
    {
    	return fun2;
    }
    
    void main()
    {
    	Function* fuction = fun1;
    	FunctionPointer1 fun = fun1;
    	int a = fun3()()(3, 4);
    	int b = fun4()()(5, 6);
    	printf("%d\n%d\n", a, b);
    	printf("fun1:%d\n*fun1:%d\n&fun1:%d", fun1, *fun1, &fun1);
    	printf("fun:%d\n*fun:%d\n&fun:%d", fun, *fun, &fun);
    	char chars[10];
    	gets(chars);
    }
    函数名前面加不加*,&操作符,都是一个效果;函数指针前面加不加*操作符是一个效果,但是加上&操作符就代表着取指针的地址了。

    可以通过typedef int Function(int, int); 为一种类型的函数定义别名,但是使用的时候只能定义指针形式的变量:Function* fuction = fun1;

    啊偶,到这就算结束了。

    参考资料:

    C语言函数指针基础

    定义返回函数指针的函数

    c语言函数指针的理解与使用

    [C/C++]如何解读返回函数指针的函数声明


    展开全文
  • C语言函数指针

    2019-02-28 20:14:55
    C语言函数指针 一.先聊聊函数名 函数名是一个函数的入口地址(一个常量),函数本质上就是一段代码,被放在内存中的“代码段”,函数名就是函数在代码段中的入口地址。调用函数的时候,通过跳转到该地址,调用函数 ...

    C语言函数指针

    一.先聊聊函数名

    函数名是一个函数的入口地址(一个常量),函数本质上就是一段代码,被放在内存中的“代码段”,函数名就是函数在代码段中的入口地址。 调用函数的时候,通过跳转到该地址,调用函数

    二.既然是一个地址,就可以使用指针变量存储

    函数指针的声明

    返回值类型 (变量名 *)(形参列表)
    例:int  (*pf)(int x, int y); 
    

    给函数指针赋值

    变量名 = [&]函数名;//&是可选项,对于函数名,加不加&结果都一样
    void f(void);//这是一个函数原型
    void (*pf)(void) = f;
    pf = &f;
    

    注意:指针声明的时候,返回值与形参列表要和被指向的函数一致

    函数调用:

    有以下3种调用方法
        f();//使用函数名调用,本质上是地址的跳转
        (*pf)();//使用指针变量,间接引用函数入口地址
        pf();//直接使用函数指针调用
    

    函数调用时,需要提供函数的入口地址,可以是函数名(第一种),也可以通过指针变量间接引用(第二种),也可以由指针变量提供入口地址(第三种)

    三.应用

    刚学函数指针的时候,难免回想,有函数名不就可以了吗,为什么还要再弄一个指针,这不没事找事吗

    回调函数

    向一个函数传递函数指针,使一个函数能够调用另一个函数,这种方法叫做回调函数

    举个栗子:C语言库函数中有一个排序的函数,它的原型是这样的

    void qsort(void *base, int nelem, int width,
     int (*fcmp)(const void *,const void *));
    

    参数说明:
    base 一个指针,存储一个数组的首地址
    nelem 数组长度(待排序个数)
    width 数组的单个元素所占字节数
    fcmp 函数指针,通过这个函数,可以由用户指定比较的方法

    int cmp(const void *a, const void *b);
    //这个就是需要回调的函数   
    
    int main(void){
    
        int a[10];
        for(int i = 0; i < 10; ++i)
            a[i] = 10 - i;
    
        qsort(a, 10, sizeof(int), cmp);
    
        for(int i = 0; i < 10; ++i)
            printf("%d ",a[i]);
    
        return 0;
    }
    
    int cmp(const void *a, const void *b){
        return *(int *)a - *(int *)b;
    }
    

    当然,函数指针的应用不仅仅只有回调函数,由于我水平有限,暂时就掌握了这么多,如果有兴趣,请自行百度

    2019/2/28 20:14:38

    展开全文
  • 本文主要介绍 C语言函数指针的知识,这里整理了详细的资料及示例代码以便大家学习参考,有需要学习此部分知识的朋友可以参考下
  • c语言函数指针

    2013-10-12 20:51:09
    由于技术的需要,这几天学习了一下关于函数指针的知识,其定义如下: “函数指针”是指向函数的指针变量,因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符...

    由于技术的需要,这几天学习了一下关于函数指针的知识,其定义如下:

    “函数指针”是指向函数的指针变量,因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上一致的。函数指针有两个用途:调用函数和做函数的参数。(来源百度百科)。

    为了能方便大家的理解,别的不解释,直接上函数~

                                                                                                                                                         ---------------------------笛风2013.10.12

    #include "stdlib.h"
    #include "stdio.h"
    
    
    void print(void *data){
    
    	printf("test\n");
    }
    
    
    int main(){
    	void (*myprint)(void *);
    	myprint = (void (*)(void *))print;
    	myprint(NULL);
    
    }
    

    另外:

    	myprint = (void (*)(void *))print;
    可以直接替换成:

    myprint =print;//将函数的入口地址复制给变量

    小伙伴们,是不是每天都在进步,涨知识了吧~~


    展开全文
  • c语言函数指针与指针函数

    千次阅读 2018-12-04 22:25:55
    //1 C语言函数指针 //解释:这是一种很特殊的指针,它的指向是一个函数的入口 //作用:该指针可以接受一个函数的地址,代表这个函数执行函数的操作 //函数指针举例 //下面是一个函数指针pFunc,...

    #include <stdio.h>
    #include <stdlib.h>
    #include <vector>

    using namespace std;

    //1 C语言函数指针
    //解释:这是一种很特殊的指针,它的指向是一个函数的入口
    //作用:该指针可以接受一个函数的地址,代表这个函数执行函数的操作

    //函数指针举例
    //下面是一个函数指针pFunc, 它只能指向返回值为float,形参为vector<float>的函数

    float (*pFunc1)(const vector<float> &);

    //函数名   : findMax
    //函数功能  : 查找vector容器的最大值
    //输入参数  : v
    //输出参数  : 无
    //返回值    : 返回vector容器的最大值

    float findMax(const vector<float> &v)
    {
        float fMax = 0;
        for (float curValue : v)
        {
            if (curValue > fMax) fMax = curValue;
        }

        return fMax;
    }

    //函数名   : findMin
    //函数功能  : 查找vector容器的最小值
    //输入参数  : v
    //输出参数  : 无
    //返回值    : 返回vector容器的最小值

    float findMin(const vector<float> &v)
    {
        auto fMin = 0xFFFFFF;
        for (auto curValue : v)
        {
            if (curValue < fMin) fMin = curValue;
        }

        return fMin;
    }

    //函数名   : average
    //函数功能  : 计算vector容器的所有元素的平均值
    //输入参数  : v
    //输出参数  : 无
    //返回值    : 返回vector容器的所有元素的平均值

    float average(const vector<float> &v)
    {
        auto fSum = 0;
        for (auto curValue : v)
        {
            fSum += curValue;
        }

        auto fAverage = fSum / v.size();

        return fAverage;
    }

    typedef float (*pPointer)(const vector<float> &);

    //C语言函数指针举例
    int main()
    {
        //用法1 先定义函数指针类型float (*pFunc1)(const vector<float> &);
        vector<float> v;
        v.push_back(10.44);
        v.push_back(15.8);
        v.push_back(112.9);

        pFunc1 = findMax;
        float fMax = (*pFunc1)(v);

        pFunc1 = findMin;
        float fMini = (*pFunc1)(v);

        pFunc1 = average;
        float fAverage = (*pFunc1)(v);

        //用法2 使用到时再定义函数指针float (*pFunc2)(const vector<float> &) = NULL;
        float (*pFunc2)(const vector<float> &) = NULL;

        pFunc2 = findMax;
        fMax = (*pFunc2)(v);

        pFunc2 = findMin;
        fMini = (*pFunc2)(v);

        pFunc2 = average;
        fAverage = (*pFunc2)(v);

        //用法3 把函数指针定义为数据类型typedef float (*pPointer)(const vector<float> &);
        pPointer pFunc3 = findMax;
        fMax = (*pFunc3)(v);

        pFunc3 = findMin;
        fMini = (*pFunc3)(v);

        pFunc3 = findMin;
        fMini = (*pFunc3)(v);

        return 0;
    }

    //2 C语言指针函数
    //解释:这是一种返回值为指针的函数
    //作用:调用这个函数,他的最终返回值是一个指针,指针类型必须一致,否则赋值失败

    //函数名   : add
    //函数功能  : 两数相加
    //输入参数  : v1 第一个数
    //输入参数  : v2 第二个数
    //输出参数  : 无
    //返回值    : 返回两数相加后的变量指针

    float *add(int v1, int v2)
    {
        float *pSum = (float*)malloc(1 * sizeof(float)); //使用必须调用delete释放内存,否则会有内存泄露
        pSum = NULL;

        //*pSum 是解指针
        *pSum = v1 + v2;

        return pSum;
    }

    //C语言指针函数举例
    int main()
    {
        float *pSum = add(10, 20);
        delete pSum; //一定要释放,否则内存泄露

        return 0;
    }

    展开全文
  • http://c.biancheng.net/view/228.html 函数指针及其定义和用法,C语言函数指针详解
  • C#委托与C语言函数指针及函数指针数组  在使用C#时总会为委托而感到疑惑,但现在总新温习了一遍C语言后,才真正理解的委托。  其实委托就类似于C/C++里的函数指针,在函数传参时传递的是函数指针,在调用的时候...
  • C语言函数指针与调用

    2020-03-24 15:25:56
    C语言函数指针与调用 平时我们使用函数传递的参数一般为数据变量,那么是否可以传递函数呢? 答案是不但可以,而且习惯以后,会用上瘾的。通过传递不同的函数指针,我们可以实现在函数中调用不同的子函数。 下面就举...
  • c语言函数指针的理解与使用
  • C语言函数指针与回调函数使用方法 函数指针 函数指针:指向函数的指针变量 声明函数指针变量格式: <返回值>(*<指针变量名称>)(<参数类型>) 示例: int sum(int x,int y) { return x + y; } //...
  • 在大家刚开始学习c语言的时候,总是分不清函数指针和指针函数,就算是知道了它们之间的区别,也不了解它们的使用场景, 我写此博客帮大家缕一缕,也帮我自己缕一缕 1、函数指针与指针函数的概念以及区别 指针函数...
  • python高阶函数:将函数作为实参进行传入...C语言函数指针:将函数的指针作为实参进行传入,函数指针也是C语言多态实现的基础。 我们可以看到他们确实有相同之处,我们来分别看一下两者的代码完成相同的功能 pytho...
  • c语言函数指针_指针函数_返回值是函数指针

    千次阅读 多人点赞 2019-03-06 17:38:43
    函数指针作为函数的返回值 1.指针函数的定义 顾名思义,指针函数即返回指针的函数。其一般定义形式如下: 类型名 *函数名(函数参数表列); 其中,后缀运算符括号“()”表示这是一个函数,其前缀运算符星号“*”...
  • C语言函数指针理解(1)

    2016-08-09 10:16:35
    C语言函数指针理解(1)
  • 前述:C语言的奥秘,博大精深,今天来回忆的分析函数指针函数指针数组的用法。具体请见下面一个注册程序的实现。 1 #include &lt;stdio.h&gt; 2 #include &lt;string.h&gt; 3 5 6 typedef ...
  • c语言函数指针的多种赋值方法

    千次阅读 2019-07-25 15:24:10
    c语言函数指针的多种赋值方法 提供框架模型,具体代码缩略,适合功能模块包装,例子程序为c语言基于TCP的图片发送 1、mdu_TcpClient.h中: 定义结构体 typedef struct { int (*init)(char *szIpaddr, char *...
  • C语言函数指针理解(2)

    2016-08-11 15:15:25
    # C语言函数指针理解(2)
  • 下面我就用一个例子给大家分享一下C语言函数指针的妙用。 格式介绍 C语言函数指针的格式为(*function)([参数表列])。函数指针主要有两种使用方法:①用函数指针指向某个函数做选择②当做函数的参数传递,使程序模块...
  • C语言函数指针基础

    2013-08-22 22:32:50
    本文将从C语言函数指针的基础开始介绍,再结合一些简单的用法和关于函数名称和地址的趣闻。在最后,本文给出一种简单的方式来看待函数指针,让你对其用法有一个更清晰的理解。  函数指针和一个简单的函数 我们从...
  • C语言函数指针定义

    2017-02-21 11:01:07
    c语言定义函数指针
  • C语言函数指针与NULL

    2019-10-20 13:36:13
    C语言中,函数指针和普通指针类似,如果定义了一个函数指针,比如int (*fun)(int a,int b); 那么函数指针fun将默认初始化为NULL。 注意: 1)函数指针不是函数声明,不要混淆。 2)C中函数名可以隐式转换为函数...
  • 参考自 http://blog.jobbole.com/44639/#jtss-ydnote 本文写的非常详细,因为我想为初学者建立一个意识...本文将从C语言函数指针的基础开始介绍,再结合一些简单的用法和关于函数名称和地址的趣闻。在最后,本文给出一

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 21,891
精华内容 8,756
关键字:

c语言函数指针

c语言 订阅