函数指针与函数声明

简介: 在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

 

 

目录
相关文章
|
小程序 开发者
小程序图片报错替换
小程序图片报错替换
220 0
|
10月前
|
存储 安全 Android开发
探索Android系统的最新安全特性
在数字时代,智能手机已成为我们生活中不可或缺的一部分。随着技术的不断进步,手机操作系统的安全性也越来越受到重视。本文将深入探讨Android系统最新的安全特性,包括其设计理念、实施方式以及对用户的影响。通过分析这些安全措施如何保护用户免受恶意软件和网络攻击的威胁,我们希望为读者提供对Android安全性的全面了解。
|
运维 测试技术 开发工具
基于通义灵码 @workspace 和 @terminal 的实践场景、效果和心得
基于通义灵码 @workspace 和 @terminal 的实践场景、效果和心得
|
网络安全 数据库 流计算
几个可能的原因会导致数据同步中断
几个可能的原因会导致数据同步中断
454 1
|
存储 人工智能 监控
AI推理
AI推理
552 1
|
SQL SpringCloudAlibaba 数据库
抖音数据库解析总结
抖音数据库解析总结
886 0
|
Python
|
存储 缓存 运维
企业上云方案:阿里云企业六大通用场景为企业提供多场景、一站式上云服务
阿里云为企业提供企业上云、企业初创必备、数字营销、企业办公、企业安全、企业数据六大上云场景、一站式上云服务(解决方案),为企业提供多场景、一站式上云服务,满足企业各个发展阶段的软硬件需求,助力您的事业腾飞!
1045 1
企业上云方案:阿里云企业六大通用场景为企业提供多场景、一站式上云服务
|
前端开发 容器
用CSS实现超美星空特效
最近真是越来越对CSS感兴趣了,于是再来整一手,夜晚的星星,再配合上皎洁的月光,这唯美的星空,它来了! 今天带领大家,用CSS实现一下,这美丽的星空。
|
编解码 开发工具 容器
阿里云视频点播服务添加视频字幕的实现方案
本文给出了一个为视频点播服务里的视频添加字幕的方案。
4871 0
阿里云视频点播服务添加视频字幕的实现方案