所谓函数指针就是一个指向函数的指针,也就是说我们定义一个函数指针量后,这个变量所在的空间要保存一个函数的地址。那么函数指针除了作为回调函数的传参之外还有什么作用呢?这里我们就结合staitc的作用来探讨一下函数指针是如何作为间谍的。

首先讨论一下static的作用,static从本质来讲就两个作用:

第一、 限定存储域:被static修饰的变量无论是局部变量还是全局变量都将被编译器存放在静态区。而实际上在gcc编译完生成的ELF格式文件中并没有静态区这个概念,所谓静态区是我们在概括讨论程序数据段的一种泛称。实际上编译器会根据具体情况把被static修饰的变量分为两类:当变量被定义并初始化为非零值的时候,变量将放在.data段;当否则为初始化或初始化为零的时候将放在.bss段。我们在不深入讨论的时候暂且可以将此两段概括为静态区。而放在静态区的变量由于存储域的原因导致生命周期很长,长度为程序(确切讲应该是该程序运行后的进程)的一次运行过程,而普通局部变量由于在运行过程中被系统分配在栈区所以生命周期只是一次函数的调用过程。

第二、 限定作用域:由于静态还是普通局部变量本身的作用域就是函数内部,因此static的作用域主要是对全局变量和函数的限定。被staitc修饰的全局变量或函数都被编译器标记为仅在本文件中使用,由于编译器在编译过程中是以.c结尾的源文件为单位依次生成以.o结尾的目标文件,所以最后连接器在连接过程中将不允许被static修饰的变量或函数的地址对外链接。这样既可以防止全局变量或函数的重名问题,又可以防止由于无关的全局变量误操作引起的程序逻辑问题。因此static就限定了变量或函数的作用域。

那么被static修饰的函数就真的只能在本文件中使用了吗?答案是否定的,由于C语言的精华——指针的强大功能让我们很轻松的利用函数指针就可以实现在文件外部调用被static修饰的函数。

首先来看一段实验代码(详见图1):


图1

代码中编写了两个源文件分别为main.c和global_fun.c。

其中main.c中定义了一个被static修饰的函数int local_fun(void);

global_fun.c中定义了global_fun()函数;

两个函数都只打印了一句话说明自己是哪个函数。由于static的限定作用导致global_fun中想要调用local_fun函数是不可能的,编译器会在连接期间报错(详见图2):


图2

接着修改程序,将global_fun函数定义为带有一个参数为函数指针的函数,并且在main函数中定义一个函数指针p指向被static修饰的静态函数local_fun,接着调用global_fun函数并给其传递参数p(详见图3):


图3

这时候编译运行,一切正常(详见图4):


图4

总结:指针是C语言的精华所在,指针的灵活实用将使你的开发工作变得游刃有余事半功倍。因此熟练掌握指针的操作对于一位从事C开发的程序员来说是不可或缺的基本功。而正因为指针的灵活多变导致我们在使用指针操作数据的时候要格外谨慎,一不小心将会导致致命的程序错误。但是C语言再强大终究只是一门工具,只要理解操作系统的原理熟悉C语言的规则然后严密谨慎地使用这门工具,那么你将会越发感受到C编程的乐趣。

通过函数指针调用static相关推荐

  1. 关于函数指针调用C++非静态成员

    当在类里面定义函数指针,而函数指针会指向类里面的成员的时候,这个时候成员需要定义为静态成员.实例代码如下: //.h #define SCMD_REGISTER 0 class CCallFuctio ...

  2. 类的成员函数指针和静态成员函数指针 调用成员函数***

    C++提供static这个关键词对静态成员进行声明,静态成员函数和类的实例化无关,对于同一类来说,静态成员函数是所有类的对象共享的.而普通成员函数需要实例化才能调用,对于每一个实例来说,普通成员函数是 ...

  3. C/C++ 函数指针调用函数

    01 //C/C++ 函数指针调用函数 02 #include<iostream> 03 using namespace std; 04   05 void site1() 06 { 07 ...

  4. C++:函数指针调用方法

    函数指针调用普通函数  #include<iostream>using namespace std;void Show()//void(*)() {cout << " ...

  5. 第16周项目3--用函数指针调用函数(吃饭,睡觉,打豆豆)

    /* * Copyright (c) 2014, 烟台大学计算机学院 * All rights reserved. * 文件名称:test.cpp * 作 者:刘畅 * 完成日期:2014 年 12 ...

  6. 如何用函数指针调用函数

    先举一个用函数指针调用函数的例子 int Func(int x); /*声明一个函数*/ int (*p) (int x); /*定义一个函数指针*/ p = Func; /*将Func函数的首地址赋 ...

  7. 通过函数名调用函数和通过函数指针调用函数有什么区别呢?为什么调用函数指针没有直接调用函数效率高?

     1.通过函数名调用函数和通过函数指针调用函数有什么区别呢? 首先函数名.函数指针都表示代码段的起始地址. 1)调用函数的时候必须指定函数名,可是当有时候不确定具体调用哪个函数,当某些事件发生后才 ...

  8. C语言函数指针调用函数

    C语言可以定义指针变量指向函数,通过指针来调用函数. 使用: 1.定义函数指针变量:  函数返回值类型 (*指针变量名)(); 2.将已有函数入口赋值给函数指针变量:fnPt = avg; 3.使用指 ...

  9. 函数指针调用类的成员函数

    1 在每个被调用函数之前加上static, 可以使成员函数脱离对象信息单独存在,虽然它属于这个类,但是没有附带上对象信息,但是前提是,static成员函数不能使用对象的信息(成员和函数). 2 使用一 ...

最新文章

  1. 2个YUV视频拼接技术
  2. p187让元素垂直居中
  3. 实习博士访谈:我终于拥有了在大学实验室梦寐以求的算力
  4. Android selector 使用
  5. at命令不生效 linux_帮你精通Linux:简约却不简单的ls命令
  6. php的文件路径问题
  7. sql 语言中 when case 用法
  8. global.min.css,css3-媒体查询样式不覆盖原始样式
  9. ps一点等于多少厘米_劝告大家:女人40岁后,体重多少算正常?太瘦也不好
  10. SecureCRT无法登录Ubuntu
  11. ios怎么创建html文件夹,ios 创建html文件
  12. c++查漏补缺之自增自减运算符重载
  13. JAVA JDK 、Maven、IDEA安装
  14. 如何免费注册申请到【苹果开发者账号】
  15. 活出生命的意义-读后感
  16. My $650,100 Lunch with Warren Buffett
  17. Python编程:re中findall()用法
  18. Python写个小游戏:速算24点(上)
  19. $ 8 : gets函数与puts函数
  20. “财界奥斯卡”CGMA全球管理会计2021年度中国大奖榜单揭晓

热门文章

  1. 目前各类型准确率最高的图像识别算法
  2. 纷享销客对接打通金蝶云星空查询对接接口(自定义)接口与物料新增接口
  3. 目标跟踪算法分析(一)
  4. 智能设备是如何连接云的
  5. PaddleHub创意---美颜证件照
  6. ROS机器人雷达跟随
  7. Python零基础速成班-第8讲-Python文件操作File IO、高级文件处理模块shutil、CSV、JSON、多线程基础
  8. html做3d的正方形,纯CSS绘制3D立方体
  9. 键盘输入一个二位十进制的月份数,然后显示出相应的英文缩写名;
  10. 乐鑫ESP-EYE编译报错