• 【解惑】函数名与函数指针


       今天在学习linux下c程序设计时,看到函数指针时,在书上看到一个例子如下:

    1 int get_max(int i, int j, int k, int (*pt)(int,int))
    2 {
    3 int ret;
    4
    5 ret = pt(i,j);
    6 // ret = (*pt)(i,j);
    7
    8 return ret;
    9 }

      没接触过,函数指针可以这样用,第一感觉应该是第六行所示的使用方式;怀疑是其书写错误,后来在实际在电脑上测试了下,结果是正确的,这两种方式都能成功运行。。。。。

       又去翻了K&R求证一下,并没提到用函数指针名直接调用函数这种方式。自己也开始纠结了,自己接着又对程序调试了一番,看下pt与*pt的值是否一样,如期待的那样是一样的,不一样程序肯定不能正确运行,看来是编译器在编译的时候对函数指针变量pt与*pt是做相同值处理,pt就等于*pt;

      最后在网上看到一篇好文,详细的讲述了函数名与函数指针的关系。

        原文:《彻底搞定C指针-函数名与函数指针

    void MyFun(int x);    //这个申明也可写成:void MyFun( int );
    void (*FunP)(int );   //也可申明成void(*FunP)(int x),但习惯上一般不这样。

    结论:

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

  • 相关阅读:
    mysql 数据库备份
    半同步复制
    mysql在线热备
    mysqlxtrabackup备份
    MySQL备份与恢复
    Mysql语句类型
    MySQL的体系结构
    MySQL介绍及安装
    Shell-02-if
    Shell 脚本进阶,经典用法及其案例
  • 原文地址:https://www.cnblogs.com/ljhero/p/1984173.html
Copyright © 2020-2023  润新知