Static与函数指针 转
所谓函数指针就是一个指向函数的指针,也就是说我们定义一个函数指针量后,这个变量所在的空间要保存一个函数的地址。那么函数指针除了作为回调函数的传参之外还有什么作用呢?这里我们就结合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编程的乐趣。
原文链接:
转载于:https://www.cnblogs.com/GUK0/p/4574551.html
Static与函数指针 转相关推荐
- static关键字 void和void指针 函数指针
static关键字 1.作用于变量: 用static声明局部变量-------局部变量指在代码块{}内部定义的变量,只在代码块内部有效(作用域),其缺省的存储方式是自动变量或说是动态存储的,即指 ...
- 通过函数指针调用static
所谓函数指针就是一个指向函数的指针,也就是说我们定义一个函数指针量后,这个变量所在的空间要保存一个函数的地址.那么函数指针除了作为回调函数的传参之外还有什么作用呢?这里我们就结合staitc的作 ...
- 函数指针amp;绑定: boost::functoin/std::function/bind
see link: https://isocpp.org/wiki/faq/pointers-to-members function vs template: http://stackoverflow ...
- C++中函数指针的使用
A function pointer is a variable that stores the address of a function that can later be called thro ...
- 函数指针--全局函数指针与类的函数指针(二)
本次对之前的说明做个补充,大体内容还是一样的. 这里对类里面的成员函数指针变量的使用继续进行了解,最主要的是希望能达到通过非静态成员指针变量来引用各自的非静态成员函数. 这样每个实例可以保存当前对象对 ...
- 函数指针与指针函数的区别
原文:http://yliangliang.blog.sohu.com/86320000.html 一.函数指针 首先它是一个指针,只是这个指针指向的是一个函数.指针变量可以指向变量的地址.数组.字符 ...
- [原创]函数指针的应用
2019独角兽企业重金招聘Python工程师标准>>> 简单的函数指针的应用,正在编辑,先剧透一下, 本人学习参考过很多代码..具体哪些就不说了,各种固件库少不了的,linux的思维 ...
- C#未来新特性:静态委托和函数指针
C#每发布一次新版本,都会增加一些底层相关的新特性, 这些特性对大多数商业程序来说并没什么实际用处,主要用于那些对性能有很高要求的代码,如图形处理.机器学习以及数学工具包,等等. 接下来的两个提案,主 ...
- 类的成员函数指针和mem_fun适配器的用法
先来看一个最简单的函数: void foo(int a) {cout << a << endl; } 它的函数指针类型为 void (*)(int); 我们可以这样使用: vo ...
最新文章
- 射影几何教程: 1 射影几何介绍
- ResNet50 复现
- vue工程全局设置ajax的等待动效
- alert文件位置 oracle,Oracle11gAlertlog文件位置的问题
- TaskTracker获取并执行map或reduce任务的过程(一)
- 同步/异步与阻塞/非阻塞的区别
- python-使用云图库实现文字填画的效果-0225
- 回调、匿名函数、闭包
- Django ModelChoiceField:过滤查询集并将默认值设置为对象
- 毕设系列之 -- 基于大数据的全国热门旅游景点数据分析与可视化
- 修改MAC地址的方法
- Python回归分析五部曲(三)—一元非线性回归
- mac安装虚拟机 centos7
- Object Classification Using CNN-Based Fusion of Vision and LIDAR in Autonomous Vehicle Environment
- 保护视力方面的电脑设定
- 中考考试的指令广播_中考考试指令系统使用的说明.doc
- 手把手教你Linux内核编译(三天吐血经历)
- RV1126 Linux 以太网MAC PHY 芯片8201f gmac dts配置
- 解决山石设备无法使用最新版chromeflash功能(91版本及以上)
- Android列表小部件(Widget)开发详解