开发者社区> 楚岩> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

函数指针与函数声明

简介: 在C语言中规定,一个函数总是占用一段连续的内存区,而函数名就是该函数所占内存区的首地址。我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使该指针变量指向该函数。然后通过指针变量就可以找到并调用这个函数。我们把这种指向函数的指针变量称为“函数指针变量”,简称:函数指针
+关注继续查看

问题:当计算机启动时,硬件将调用首地址为0的子例程,为了模拟开机启动时的情形,如何设计出一个C语句,以显示调用该子例程。

换个问法:有一段程序存储在起始地址为 0的一段内存上,如果我们想要调用这段程序,请问该如何去做? 

《C陷阱与缺陷》给出答案:(*(void(*)())0)();

 

相关知识:函数指针

函数指针是指向函数的指针变量,即本质是一个指针变量。

在C语言中规定,一个函数总是占用一段连续的内存区,而函数名就是该函数所占内存区的首地址。我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使该指针变量指向该函数。然后通过指针变量就可以找到并调用这个函数。我们把这种指向函数的指针变量称为“函数指针变量”,简称:函数指针

指向函数的指针包含了函数的地址,可以通过它来调用函数。声明格式如下:

  类型说明符 (*函数名)(参数)

其实这里不能称为函数名,应该叫做指针的变量名。这个特殊的指针指向一个返回整型值的函数。指针的声明必须和它指向函数的声明保持一致。

//函数指针示例:
void func(int x, int y);   //声明一个函数
void(*f) (int, int); //声明一个函数指针 f=func; //将func函数的首地址赋给指针f
(*func)(1, 2) //调用形式,等价于func()

 

问题分析:

  1、想要调用这段程序(子例程),设为func函数,由上述相关知识,我们可以使用最基本的指针函数void(*f) ()来调用子例程,调用方法:(*func)();

  2、子例程存储在起始地址为 0的一段内存上,故可理解为0是这个子例程的入口地址,func函数入口地址为0。即func指向地址为0的函数;

  3、由2知,func为指向地址0的函数,所以func是一个函数指针,设func是一个指向返回值为void类型的函数的指针,故可设func的函数指针声明为void (*pFunc)();

  4、由函数声明void (*pFunc)()类比于变量声明,同样,通过强制转换,我们可以得到地址为0的入口函数地址(void (*)())0;

  5、将4代入1中,即有(*(void (*)())0)().

 

其他:

指针函数:

一个函数不仅可以带回一个整型数据的值,字符类型值和实型类型的值,还可以带回指针类型的数据,使其指向某个地址单元。

      返回指针的函数,一般定义格式为:类型标识符    *函数名(参数表)

  示例:int *f(x,y);

函数指针是一个指向函数的指针,而指针函数只是说明他是一个返回值为指针的函数。

 

void* 指针:

C++提供了一种特殊的指针类型void*,它可以保存任何对象类型的地址(C++ PRIMER)。

参考:http://lionwq.spaces.eepw.com.cn/articles/article/item/18258

         http://blog.csdn.net/norbe/article/details/624257

 

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
指针函数和函数指针
一、指针函数 二、函数指针
11 0
函数指针数组的指针
下面定义一个简单的函数指针数组的指针: char* (*(*pf)[3])(char* c); pf是一个指针,这个指针指向一个有3个元素的数组,每个元素是一个参数为char* ,返回值为char *的指针。
907 0
声明
我的博客即将入驻“云栖社区”,诚邀技术同仁一同入驻。
1068 0
函数指针简单的列子
关于函数指针的简单例子 函数指针简单格式如下: int (*p)(int i, char c) 首先它是一个指针,其次它是指向一个函数地址的指针,再次这个函数的返回值为int数值.
588 0
函数指针形参
编写函数的声明,令其接受两个int形参并且返回类型也是int;然后声明一个vector对象,令其元素是指向该函数的指针。编写4个函数,分别对两个int值执行加、减、乘除运算。 #include #include #include using namespace std; int p...
699 0
指针和函数
指针和函数的关系   可以把一个指针声明成为一个指向函数的指针。intfun1(char*,int); int(*pfun1)(char*,int); pfun1=fun1; .... .... inta=(*pfun1)("abcdefg",7);//通过函数指针调用函数。
484 0
+关注
楚岩
后台开发,爱好技术,烹饪,还想要学挖掘机。
14
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载