函数指针与函数声明

问题:当计算机启动时,硬件将调用首地址为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

 

 

时间: 2024-09-02 13:27:56

函数指针与函数声明的相关文章

C++中的函数指针与函数对象的总结

以下是对C++中的函数指针与函数对象的使用进行了详细的分析介绍,需要的朋友可以参考下   篇一.函数指针函数指针:是指向函数的指针变量,在C编译时,每一个函数都有一个入口地址,那么这个指向这个函数的函数指针便指向这个地址. 函数指针的用途是很大的,主要有两个作用:用作调用函数和做函数的参数. 函数指针的声明方法:数据类型标志符 (指针变量名) (形参列表): 一般函数的声明为: int func ( int x );而一个函数指针的声明方法为:int (*func) (int x);前面的那个(

C++中的函数指针和函数对象总结

篇一.函数指针函数指针:是指向函数的指针变量,在C编译时,每一个函数都有一个入口地址,那么这个指向这个函数的函数指针便指向这个地址.函数指针的用途是很大的,主要有两个作用:用作调用函数和做函数的参数.函数指针的声明方法:数据类型标志符 (指针变量名) (形参列表):一般函数的声明为: int func ( int x );而一个函数指针的声明方法为:int (*func) (int x);前面的那个(*func)中括号是必要的,这会告诉编译器我们声明的是函数指针而不是声明一个具有返回型为指针的函

详解C语言编程中的函数指针以及函数回调_C 语言

函数指针: 就是存储函数地址的指针,就是指向函数的指针,就是指针存储的值是函数地址,我们可以通过指针可以调用函数. 我们先来定义一个简单的函数: //定义这样一个函数 void easyFunc() { printf("I'm a easy Function\n"); } //声明一个函数 void easyFunc(); //调用函数 easyFunc(); //定义这样一个函数 void easyFunc() { printf("I'm a easy Function\n

delphi 函数指针 参数-delphi使用函数指针调用函数第一个参数不能获取。

问题描述 delphi使用函数指针调用函数第一个参数不能获取. 完整代码如下所示,定义了一个函数指针类型TFunctiontest = function (const a:integer; const b:integer; const c:integer): integer; 然后定义了一个指针变量.再定义了一个函数function functiona(const a :integer; const b:integer;const c:integer):integer;并将该函数的地址赋值给函数

2014秋C++第16周 项目3参考 用函数指针调用函数

课程主页在http://blog.csdn.net/sxhelijian/article/details/39152703,课程资源在云学堂"贺老师课堂"同步展示,使用的帐号请到课程主页中查看.  [项目3-用函数指针调用函数] 将下面的程序补充完整(包括定义函数),使其能够完成图示的功能.请使用已有程序的风格. void eat(); void sleep(); void hitdoudou(); void run(void (*f)()); int main() { int iCh

定义返回函数指针的函数

博学,切问,近思--詹子知 (https://jameszhan.github.io) 1. 基础知识: 1) 定义函数指针: return_type (*func_pointer)(parameter_list) 2) 定义返回函数指针的函数: return_type(*function(func_parameter_list))(parameter_list) 定义了一个函数function,该函数的参数列表是(function_patameter_list),返回类型是一个函数指针,这个函

如何通过函数指针调用函数(实现代码)_C 语言

说明:指针可以不但可以指向一个整形,浮点型,字符型,字符串型的变量,也可以指向相应的数组,而且还可以指向一个函数. 一个函数在编译的时候会被分配给一个入口地址.这个函数入口地址称为函数的指针.可以用一个指针变量指向函数,然后通过该指针变量调用此函数. 定义指向函数的指针变量的方法是: 复制代码 代码如下: int (*p) (int ,int ); int[指针变量p指向的函数的类型] (*p)[p是指向函数的指针变量] ( int,int )[p所指向的形参类型]; 与函数的原型进行比较 复制

声明函数指针并实现回调

程序员常常需要实现回调.本文将讨论函数指针的基本原则并说明如何使用函数指针实现回调.注意这里针对的是普通的函数,不包括完全依赖于不同语法和语义规则的类成员函数(类成员指针将在另文中讨论). 声明函数指针 回调函数是一个程序员不能显式调用的函数:通过将回调函数的地址传给调用者从而实现调用.要实现回调,必须首先定义函数指针.尽管定义的语法有点不可思议,但如果你熟悉函数声明的一般方法,便会发现函数指针的声明与函数声明非常类似.请看下面的例子: void f():// 函数原型 上面的语句声明了一个函数

函数指针与指针函数的学习总结

函数指针是指向函数的指针,指针函数是指一个函数的返回值是一个指针,但下面的几道题还是感觉很迷惑.各位能否讲的详细点呢? (1) float(**def)[10]   def是什么? (2) double*(*gh)[10]   gh是什么? (3) double(*f[10])()   f是什么? (4) int*((*b)[10])    b是什么?这样老感觉有点乱,有什么窍门可以记得并理解的清楚一点么? ======================解答:   (1) def是一个指针, 指向