函数指针及其定义和用法

1.什么是函数指针

如果在程序中定义了一个函数,那么在编译时系统就会为这个函数代码分配一段存储空间,这段存储空间的首地址称为这个函数的地址。而且函数名表示的就是这个地址。既然是地址我们就可以定义一个指针变量来存放,这个指针变量就叫作函数指针变量,简称函数指针

那么这个指针变量怎么定义呢?虽然同样是指向一个地址,但指向函数的指针变量同我们之前讲的指向变量的指针变量的定义方式是不同的。例如:

 int(*p)(int, int);

这个语句就定义了一个指向函数的指针变量 p。首先它是一个指针变量,所以要有一个“ * ”,即(* p);其次前面的 int 表示这个指针变量可以指向返回值类型为 int 型的函数;后面括号中的两个 int 表示这个指针变量可以指向有两个参数且都是 int 型的函数。所以合起来这个语句的意思就是:定义了一个指针变量 p,该指针变量可以指向返回值类型为 int 型,且有两个整型参数的函数。p 的类型为 int(*)(int,int)。
所以函数指针的定义方式为:

函数返回值类型 (* 指针变量名) (函数参数列表);

“函数返回值类型”表示该指针变量可以指向具有什么返回值类型的函数;“函数参数列表”表示该指针变量可以指向具有什么参数列表的函数。这个参数列表中只需要写函数的参数类型即可。

我们看到,函数指针的定义就是将“函数声明”中的“函数名”改成“(* 指针变量名)”。但是这里需要注意的是:“(*指针变量名)”两端的括号不能省略,括号改变了运算符的优先级。如果省略了括号,就不是定义函数指针而是一个函数声明了,即声明了一个返回值类型为指针型的函数。

那么怎么判断一个指针变量是指向变量的指针变量还是指向函数的指针变量呢?首先看变量名前面有没有“ * ”,如果有“ * ”说明是指针变量;其次看变量名的后面有没有带有形参类型的圆括号,如果有就是指向函数的指针变量,即函数指针,如果没有就是指向变量的指针变量。

最后需要注意的是,指向函数的指针变量没有 ++ 和 – 运算。

2.如何用函数指针调用函数

给大家举一个例子:

int Func(int x);   /*声明一个函数*/
int (*p) (int x);  /*定义一个函数指针*/
p = Func;          /*将Func函数的首地址赋给指针变量p*/

赋值时函数 Func 不带括号,也不带参数。由于函数名 Func 代表函数的首地址,因此经过赋值以后,指针变量 p 就指向函数 Func() 代码的首地址了。

下面来写一个程序,看了这个程序你们就明白函数指针怎么使用了:

# include <stdio.h>
int Max(int, int);  //函数声明
int main(void)
{int(*p)(int, int);  //定义一个函数指针int a, b, c;p = Max;  //把函数Max赋给指针变量p, 使p指向Max函数printf("please enter a and b:");scanf("%d%d", &a, &b);c = (*p)(a, b);  //通过函数指针调用Max函数printf("a = %d\nb = %d\nmax = %d\n", a, b, c);return 0;
}
int Max(int x, int y)  //定义Max函数
{int z;if (x > y){z = x;}else{z = y;}return z;
}
输出结果是:
please enter a and b:3 4
a = 3
b = 4
max = 4

3.类的函数指针该怎么使用

typedef int(CClock::*PFN_GETHOUR)(void);
class CClock
{int m_Hour;int m_Minute;int m_Second;void getHour(){};void setHour(){};
}
int main()
{CClock clock1;CClock* p = &clock1;PFN_GETHOUR lp = &CClock::GetHour;//类的成员函数指针的调用(clock1.*lp)();(p->*lp)();
}

函数指针及其定义和用法相关推荐

  1. 【C语言学习笔记】函数指针的定义和用法

    函数指针的定义和用法 先回顾下数组的储存方式,当你在程序中定义了一个数组,那么系统就会自动根据你的数组类型和数组长度申请一块储存空间给你.而且数组名储存的地址刚好就是申请的这块储存空间的首地址,这也是 ...

  2. 函数指针及其定义和用法,C++函数指针详解(附用法代码和注意事项)

    函数指针可以像一般函数一样,用于调用函数.传递参数.在如 C 这样的语言中,通过提供一个简单的选取.执行函数的方法,函数指针可以简化代码.函数指针只能指向具有特定特征的函数.因而所有被同一指针运用的函 ...

  3. 【c++】23.【函数指针】定义? 为什么不直接调用函数而要使用函数指针?

    1. 函数指针及其定义和用法,C语言函数指针详解 原文链接:http://c.biancheng.net/view/228.html 什么是函数指针 如果在程序中定义了一个函数,那么在编译时系统就会为 ...

  4. C++的this指针【定义、用法、本质、特点】

    一.this指针的定义及用法 我们知道在C++中成员变量和成员函数是分开存储的,每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码. 那么问题是:这一块代码是如何区分哪个 ...

  5. 函数指针的定义和初始化

    关于函数指针的定义和初始化有两点需要注意: 1.括号不可少 在定义时*p必须用括号括起来,如果去掉括号代码变为: int *p(int ,int)//p是函数,而非函数指针,返回值类型为int * 正 ...

  6. 函数指针的定义与使用

    函数指针 一个函数在编译时被分配一个入口地址,函数名代表函数的入口地址,可以定义一个指针,保存函数的入口地址,该指针就是一个函数指针. 函数指针的定义 // 1 直接定义函数指针 // int fun ...

  7. php切换当前目录,php 改变当前目录函数chdir()的定义与用法实例详解

    php chdir()函数的定义与用法? 在PHP 中,chdir()函数是改变当前目录,什么意思呢,就是将获取当前的目录,换一个目录,本来你的当前目录是WWW/index目录,当使用了chdir() ...

  8. 函数指针的定义和函数指针数组

    #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string. ...

  9. C语言 函数指针一(函数指针的定义)

    //函数指针 #include<stdio.h> #include<stdlib.h> #include<string.h>//函数指针类型跟数组类型非常相似//函 ...

最新文章

  1. XLSReadWriteII5使用参考
  2. 登录表单 参考新浪微博
  3. 3D 鼠标跟随脚本详解
  4. excel自定义函数添加和使用方法
  5. 008_MAC 终端使用技巧
  6. 小宝机器人的储存容量_扫地机器人和吸尘器哪个更实用?
  7. Java基础 --存储数据
  8. iOS 关于单例那点事
  9. 电脑录屏软件哪个好?快速录制高清视频的方法是什么?
  10. 安装python失败的方法_安装python不失败的方法
  11. 利用IV分析仪测量二极管的伏安特性
  12. 【Web】CGI简介
  13. Python数据结构栈,后进先出
  14. 政府赠予固定资产或者捐赠资金的会计分录
  15. 全志XR829 WIFI和BT模块在T7 Android8.1上调试
  16. 【Golang | gRPC】使用protoc编译.proto文件
  17. 深度学习课程资源整理
  18. 谷歌浏览器chrome怎么设置成中文
  19. 第一个STM32CubeIDE项目
  20. Nginx-一个IP配置多个站点

热门文章

  1. 中小企业选择OA移动办公软件时,一定要考虑这些因素
  2. 分享3个文字配音软件,帮助你们轻松制作短视频
  3. position:absolute水平居中
  4. python基础语法花多长时间_怎么自学python,大概要多久?
  5. linux关闭virbr0网卡
  6. 微信小程序通过经纬度获取当前省市区及地址信息
  7. linux vim复制当前行,Vim 行选择复制和移动
  8. 解决safari浏览器打开页面会报错` Invalid Date`问题
  9. 常成员变量,常成员对象,常成员函数的详解
  10. python人像绘制_用Python 代码实现简单图片人像识别换脸