当前位置: 首页 > news >正文

磁力链/四川百度推广和seo优化

磁力链,四川百度推广和seo优化,建设监理网站,怎么选择模板建站服务程序员常常需要实现回调。本文将讨论函数指针的基本原则并说明如何使用函数指针实现回调。注意这里针对的是普通的函数,不包括完全依赖于不同语法和语义规则的类成员函数(类成员指针将在另文中讨论)。 函数指针变量: 在C语言中,一…

 程序员常常需要实现回调。本文将讨论函数指针的基本原则并说明如何使用函数指针实现回调。注意这里针对的是普通的函数,不包括完全依赖于不同语法和语义规则的类成员函数(类成员指针将在另文中讨论)。

 

 

函数指针变量:
在C语言中,一个函数总是占用一段连续的内存区,而函数名就是该函数所占内存区的首地址。函数名会自动退化成函数指针。
我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使该指针变量指向该函数。
然后通过指针变量就可以找到并调用这个函数。我们把这种指向函数的指针变量称为“函数指针变量”。
函数指针变量定义的一般形式为:类型说明符 ( * 指针变量名)();
其中
“类型说明符” 表示被指函数的返回值的类型。
(* 指针变量名) 表示 * 后面的变量是定义的指针变量。
最后的空括号    表示指针变量所指的是一个函数。

函数指针变量形式调用函数的步骤如下:
1) 先定义函数指针变量。
2) 把被调函数的入口地址(函数名)赋予该函数指针变量,如程序中第11行 pmax=max;
3) 用函数指针变量形式调用函数,如程序第14行 z=(*pmax)(x,y);
4) 调用函数的一般形式为: (*指针变量名) (实参表)

使用函数指针变量还应注意以下两点:
a) 函数指针变量不能进行算术运算,这是与数组指针变量不同的。
数组指针变量加减一个整数可使指针移动指向后面或前面的数组元素,而函数指针的移动是毫无意义的。
b) 函数调用中(*指针变量名)的两边的括号不可少,其中的*不应该理解为求值运算,在此处它只是一种表示符号。



声明函数指针

    回调函数是一个程序员不能显式调用的函数;通过将回调函数的地址传给调用者从而实现调用。要实现回调,必须首先定义函数指针。尽管定义的语法有点不可思议,但如果你熟悉函数声明的一般方法,便会发现函数指针的声明与函数声明非常类似。请看下面的例子:

void f();// 函数原型

上面的语句声明了一个函数,没有输入参数并返回void。那么函数指针的声明方法如下:

void (*) ();

    让我们来分析一下,左边圆括弧中的星号是函数指针声明的关键。另外两个元素是函数的返回类型(void)和由边圆括弧中的入口参数(本例中参数是空)。注意本例中还没有创建指针变量-只是声明了变量类型。目前可以用这个变量类型来创建类型定义名及用sizeof表达式获得函数指针的大小:

// 获得函数指针的大小
unsigned psize = sizeof (void (*) ()); 

// 为函数指针声明类型定义
typedef void (*pfv) ();

pfv是一个函数指针,它指向的函数没有输入参数,返回类行为void。使用这个类型定义名可以隐藏复杂的函数指针语法。

指针变量应该有一个变量名:

void (*p) (); //p是指向某函数的指针

    p是指向某函数的指针,该函数无输入参数,返回值的类型为void。左边圆括弧里星号后的就是指针变量名。有了指针变量便可以赋值,值的内容是署名匹配的函数名和返回类型。例如:

void func() 
{
/* do something */

p = func; 

p的赋值可以不同,但一定要是函数的地址,并且署名和返回类型相同。

传递回调函数的地址给调用者

    现在可以将p传递给另一个函数(调用者)- caller(),它将调用p指向的函数,而此函数名是未知的:

void caller(void(*ptr)())
{
ptr(); /* 调用ptr指向的函数 */ 
}
void func();
int main()
{
p = func; 
caller(p); /* 传递函数地址到调用者 */
}

    如果赋了不同的值给p(不同函数地址),那么调用者将调用不同地址的函数。赋值可以发生在运行时,这样使你能实现动态绑定。

调用规范

    到目前为止,我们只讨论了函数指针及回调而没有去注意ANSI C/C++的编译器规范。许多编译器有几种调用规范。如在Visual C++中,可以在函数类型前加_cdecl,_stdcall或者_pascal来表示其调用规范(默认为_cdecl)。C++ Builder也支持_fastcall调用规范。调用规范影响编译器产生的给定函数名,参数传递的顺序(从右到左或从左到右),堆栈清理责任(调用者或者被调用者)以及参数传递机制(堆栈,CPU寄存器等)。

    将调用规范看成是函数类型的一部分是很重要的;不能用不兼容的调用规范将地址赋值给函数指针。例如:

// 被调用函数是以int为参数,以int为返回值
__stdcall int callee(int); 

// 调用函数以函数指针为参数
void caller( __cdecl int(*ptr)(int)); 

// 在p中企图存储被调用函数地址的非法操作
__cdecl int(*p)(int) = callee; // 出错


    指针p和callee()的类型不兼容,因为它们有不同的调用规范。因此不能将被调用者的地址赋值给指针p,尽管两者有相同的返回值和参数列。

转载于:https://www.cnblogs.com/guozhiming2003/archive/2009/12/08/1619425.html

http://www.lbrq.cn/news/945145.html

相关文章:

  • 常州个人网站建设/刚刚北京传来重大消息
  • 哪有做网站的/百度热搜关键词
  • 宜兴网站开发/郑州粒米seo顾问
  • 山东做网站建设的好公司排名/微信公众号推广软文案例
  • 石家庄建站模板厂家/谷歌google下载
  • 网站建设需要在网络上如何实现/台州网站优化公司
  • 河南省住房和城乡建设厅网站/宁波优化网站哪家好
  • 云主机 怎么做网站/制作网页的网站
  • 苏州网络销售公司/长沙靠谱的关键词优化
  • 杭州高端定制网站/seo优化多少钱
  • 创意生日礼物定制/seo自动工具
  • 永康网站建设/广西seo经理
  • 自己做网站做那种类型/厦门站长优化工具
  • 如何在阿里巴巴建设网站/晚上国网app
  • java官方网站开发/seo云优化如何
  • 做带v头像的网站/app拉新接单平台
  • asp.net4.5网站开发/网站快速被百度收录
  • 江苏中益建设官方网站/万网域名购买
  • 网站建设开发模式h5/seo点击排名工具有用吗
  • 德阳做网站的/百度站长工具官网
  • 驾校网站建设方案/百度seo建议
  • 网站设计的企业/百度广告搜索引擎
  • 哪个网站可以下载做多日剧/石家庄seo推广公司
  • 做ppt赚钱的网站/百度关键词热度
  • 全国住房城乡建设厅网站/汕头seo全网营销
  • 营销公司业务范围/windows优化软件哪个好
  • 代做网站多少钱/无锡seo网站排名
  • 如何做企业网站建设/seo教学培训
  • 百度信息流网站可以做落地页吗/网络营销促销方案
  • 做网站视频教程/网页设计个人主页模板
  • 秋招Day20 - 微服务 - 概念
  • 2025年02月11日 Go生态洞察:Go 1.24 发布亮点全面剖析
  • 一些常见的网络攻击方式
  • 【RDMA】Adapters PRM Mellanox Adapters Programmer’s Reference mellanox网卡编程手册0.52
  • 如何理解SpringBoot starters的自动装配
  • 【lucene】AttributeSource概述