指向函数的指针 ------ 函数指针(function pointer)
函数指针:
指向函数的指针, 首先是一个指针, 这个指针指向一个函数。
函数具有可赋值给指针的物理内存地址,一个函数的函数名就是一个指针,它指向函数的代码。一个函数的地址是该函数的进入点,也是调用函数的地址。函数的调用可以通过函数名,也可以通过指向函数的指针来调用。函数指针还允许将函数作为变元传递给其他函数。
不带括号和变量列表的函数名,这可以表示函数的地址,正如不带下标的数组名可以表示数组的首地址。
定义形式:
类型 (*指针变量名)(参数列表);
例如:
int (*p)(int i,int j);
p是一个指针,它指向一个函数,该函数有2个整形参数,返回类型为int。p首先和*结合,表明p是一个指针。然后再与()结合,表明它指向的是一个函数。指向函数的指针也称为函数指针。
例1:
#include <stdio.h>
#define GET_MAX 0
#define GET_MIN 1
int get_max(int i,int j)
{
return i>j?i:j;
}
int get_min(int i,int j)
{
return i>j?j:i;
}
int compare(int i,int j,int flag)
{
int ret;
//这里定义了一个函数指针,就可以根据传入的flag,灵活地决定其是指向求大数或求小数的函数
//便于方便灵活地调用各类函数
int (*p)(int,int);
if(flag == GET_MAX)
p = get_max;
else
p = get_min;
ret = p(i,j);
return ret;
}
int main()
{
int i = 5,j = 10,ret;
ret = compare(i,j,GET_MAX);
printf("The MAX is %d\n",ret);
ret = compare(i,j,GET_MIN);
printf("The MIN is %d\n",ret);
return 0 ;
}
例2:
#include <stdio.h>
#include <string.h>
void check(char *a,char *b,int (*cmp)(const char *,const char *));
int main()
{
char s1[80],s2[80];
int (*p)(const char *,const char *);
//将库函数strcmp的地址赋值给函数指针p
p=strcmp;
printf("Enter two strings.\n");
gets(s1);
gets(s2);
check(s1,s2,p);
}
void check(char *a,char *b,int (*cmp)(const char *,const char *))
{
printf("Testing for equality.\n");
//表达式(*cmp)(a,b)调用strcmp,由cmp指向库函数strcmp(),由a和b作调用strcmp()的参数。
//调用时,与声明的情况类似,必须在*cmp周围使用一对括号,使编译程序正确操作,
//同时这也是一种良好的编码风格,指示函数是通过指针调用的,而不是函数名。
if((*cmp)(a,b)==0)
printf("Equal\n");
else
printf("Not Equal\n");
}
例3:
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
//check()函数的第3个函数是函数指针,就可以根据具体情况传入不同的处理函数
void check(char *a,char *b,int (*cmp)(const char *,const char *));
//自定义的比较两个字符串的函数
int compvalues(const char *a,const char *b);
int main()
{
char s1[80],s2[80];
printf("Enter two values or two strings.\n");
gets(s1);
gets(s2);
//如果是数字,则用函数指针传入数字比较函数进行处理
if(isdigit(*s1))
{
printf("Testing values for equality.\n");
check(s1,s2,compvalues);
}
//如果是字符串,则用函数指针传入库函数strcmp进行处理
else
{
printf("Testing strings for equality.\n");
check(s1,s2,strcmp);
}
}
void check(char *a,char *b,int (*cmp)(const char *,const char *))
{
if((*cmp)(a,b)==0)
printf("Equal.\n");
else
printf("Not Equal.\n");
}
int compvalues(const char *a,const char *b)
{
if(atoi(a)==atoi(b))
return 0;
else
return 1;
}
---------------------
作者:str999_cn
来源:CSDN
原文:https://blog.csdn.net/str999_cn/article/details/78591369
版权声明:本文为博主转载,若有侵权请联系本人删除
指向函数的指针 ------ 函数指针(function pointer)的更多相关文章
- 类非静态成员的函数指针 的使用 Function pointer of a non-static member function of a class
you can get the pointer of the method, but it has to be called with an object typedef void (T::*Meth ...
- C 函数与指针(function & pointer)
C 函数与指针(function & pointer) /* * function.c * 函数在C中的使用 * */ #include <stdio.h> int noswap( ...
- 指针函数(Pointer Function)和函数指针(Pointer to Function或Function Pointer)
一.指针函数 1.解释:指针函数很好理解:简单来说,就是一个返回指针的函数,本质是一个函数.如: int fun(int x,int y); //这是一个普通函数的声明,返回值是一个int类型, ...
- 返回指针的函数 ------ 指针函数(pointer function)
指针函数: 其本质是一个函数, 其函数返回值为某一类型的指针. 定义形式: 类型 *指针变量名(参数列表): 例如: int *p(int i,int j); p是一个函数名,该函数有2个整形参数,返 ...
- typedef 函数指针 数组 std::function
1.整型指针 typedef int* PINT;或typedef int *PINT; 2.结构体 typedef struct { double data;}DATA, *PDATA; //D ...
- c++指向指针的指针与 c++指针作为函数参数传递问题
一直搞不明白,c++中指针到底是个啥东西,今天遇到到c++,指向指针的指针的问题,突然有点开窍了. 举个例子: int main(int argc, char** argv){ int a[5]={1 ...
- c++11 符号修饰与函数签名、函数指针、匿名函数、仿函数、std::function与std::bind
一.符号修饰与函数签名 1.符号修饰 编译器将c++源代码编译成目标文件时,用函数签名的信息对函数名进行改编,形成修饰名.GCC的C++符号修饰方法如下: 1)所有符号都以_z开头 2)名字空间的名字 ...
- C++ 必知必会:条款16 指向成员函数的指针并非指针
这一点与指向成员的指针类似,其实现可能更加复杂,因为成员函数同时还存在虚拟函数,需要动态绑定执行动作.当然这种属性是属于函数本身的,此处表达的是指针不涉及函数的属性问题. 1: class shape ...
- 有两个指针pa,pb分别指向有两个数,a,b,请写一个函数交换两个指针的指向,也就是让pa指向b,让pb指向a
题目:有两个指针pa,pb分别指向有两个数,a,b,请写一个函数交换两个指针的指向,也就是让pa指向b,让pb指向a,具体实现如下: #include<stdlib.h> #include ...
随机推荐
- 微信公众号开发流程,jssdk的使用以及签名算法的实现
一 开发流程 1 基本配置-登录自己的公众号 A:新型微信认证,认证过的企业号才可以进行自定义菜单中的连接跳转: B:开发基本配置里面进行开发者iD查询,密码查询和重置和ip白名单配置: C:公众号设 ...
- Gym - 100989H
After the data structures exam, students lined up in the cafeteria to have a drink and chat about ho ...
- Redis学习-sorted set数据类型
sorted set 是有序集合,它在 set 的基础上增加了一个顺序属性,这一属性在添加修 改元素的时候可以指定,每次指定后,会自动重新按新的值调整顺序. zadd key score member ...
- PHP遍历目录和文件及子目录和文件
正常直接使用opendir方法,就可以读到所有的目录和文件 文件可以直接记录下来,目录则需要再进一步获取里边的文件信息 也就是,如果当前读出来是目录,则需要再次调用函数本身(递归),直到没有目录 循环 ...
- 安装GDB-ImageWatch ,在QT中查看图像
GDB_ImageWatch是在Linux下基于QT编写图像处理程序的调试程序. 由于并非像ImageWatch一样由官方提供,而是在github上以代码的方式进行提供,我们在使用的时候需要自己编译, ...
- 尚硅谷面试第一季-13git分支相关命令
课堂重点:分支相关命令 实际应用-工作流程 实操命令及运行结果: 创建master分支并提交 git init git add . git commit -m "V1.0" git ...
- 【问题解决:信息提示】SpringBoot启动时提示The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path
问题描述 springboot程序在启动时提示信息 [2018-10-24 21:59:05.214] - 440 信息 [restartedMain] --- org.apache.catalina ...
- Python作业
1使用while 循环输入1,2,3,4,5,6,,8,9,10 count = 0 while count<10: count+=1 if count ==7: continue print( ...
- 编码原则 之 Hollywood Principle
原文 The Hollywood Principle states, “Don’t Call Us, We’ll Call You.” It’s closely related to the Depe ...
- Java使用Sockt进行通信(2)
使用TCP协议编写Sockt TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议,由IETF的RFC 793定义. ...