C语言指针—指向函数的指针

1.什么是函数指针

在程序中定义了一个函数,在编译时,系统为函数代码分配一段存储空间,这段存储空间的起始地址(又称入口地址)称为这个函数的指针。

一般形式:

类型名 (*指针变量名)(函数参数表列)

例如:

int (*p)(int int)

定义p是一个指向函数的指针变量,它可以指向函数的类型为整型且与两个整型参数的函数。p的类型用int(*)(int,int)表示。

2.函数指针变量的应用

(1)用函数求整数a和b的大者

#include

int max(int x,int y)

{

int z;

if(x>y)

{

z=x;

}

else

{

z=y;

}

return (z);

}

int main()

{

int (*p)(int ,int); //定义指向函数的指针变量

int a,b,c;

p=max; //使p指向max函数

printf("please enter a and b:\n");

scanf("%d,%d",&a,&b);

c=(*p)(a,b); //通过指针变量调用max函数

printf("a=%d\nb=%d\nmax=%d\n",a,b,c);

return 0;

}

程序分析:

“int()p(int int);”用来定义一个指向函数的指针变量。注意(*p)两侧的括号不能省略,表示p先与*结合,是指针变量,然后再与后面的()结合,()表示函数,即该指针变量不是指向一般的变量,而是指向函数。

如果写成了“int p(int int)”,由于()优先级高于*,它相当于“int*(p(int int)),就成为声明一个p函数了

赋值语句“p=max”的作用是将函数的入口地址赋给指针变量p,p就是指向函数max的地址。即c=(*p)(a,b);和c=max(a,b)等价。

(2)利用一个函数实现多个函数的功能

问题:有两个整数a和b用户输入1,2或3。如输入1,,程序就给出a和b中的大者;如输入2,程序就给出两者中的小者;如输入3,程序就给出a和b的和。

#include

int main()

{

int fun(int x,int y,int (*p)(int,int));

int max(int,int);

int min(int,int);

int add(int,int);

int a=34,b=-21,n;

printf("please choose 1,2or3: ");

scanf("%d",&n);

if(n==1)

{

fun(a,b,max);

}

if(n==2)

{

fun(a,b,min);

}

if(n==3)

{

fun(a,b,add);

}

return 0;

}

int fun(int x,int y,int(*p)(int,int)) //定义fun函数

{

int result;

result=(*p)(x,y);

printf("%d\n",result); //输出结果

}

int max(int x,int y) //定义max函数

{

int z;

if(x>y)

{

z=x;

}

else

{

z=y;

}

printf("max=");

return (z); //输出两者中的大值

}

int min(int x,int y) //定义min 函数

{

int z;

if(x>y)

{

z=y;

}

else

{

z=x;

}

printf("min=");

return(z); //输出两者中的小值

}

int add(int x,int y) //定义add函数

{

int z;

z=x+y;

printf("min=");

return(z); //返回值是两数中之和

}

运行结果:

若输入1

please choose 1,2or3: 1

max=34

若输入2

please choose 1,2or3: 2

min=-21

若输入3

please choose 1,2or3: 3

add=13

程序分析:

在定义fun函数时函数首部用“int(*p)(int,int)”声明形参p是指向函数的指针。调用fun函数时,函数名min,max,add,作为实参将其入口地址传送给fun函数中的形参p。

3.指针变量使用说明

(1)定义指针变量只能指向定义时指向的函数。如前面的“int (*p)(int ,int );“表示指针变量p只能指向返回值为整型且有两个整型参数的函数。然后把那个函数名赋给函数名即可。

(2)如果要用指针点调用函数,必须使指针变量指向该函数。如:

p=max;

这就把max函数的地址赋给指针变量p.

(3)再给函数指针变量赋值时,只需给出函数名而不必给出参数。如:

p=max;

因为只是赋地址,若“p=max(a,b)”为函数的调用,故错误。

(4)用函数指针变量调用函数时,只需将(*p)代替函数名即可(p为指针变量名),

在(*p)之后的括号中根据需要写上实参。例如:

c=(*p)(a,b);

(5)对指向函数的指针不能进行算术运算,如:p+n,p++。

4.指向函数的指针应用条件:

通常通过编写一个通用的函数来实现各种专用的功能。例如第二个程序中通过输入一个数字,然后通过输入不同的值调用不同的函数,实现不同的功能。当然也可以用if语句或switch语句进行判断,调用不同的函数。但是用指针变量显得更专业。

c语言指针怎么指向函数,C语言指针---指向函数的指针相关推荐

  1. c语言 返回函数是结构体指针变量,一个函数返回值为指向结构体的指针的问题...

    一个函数返回值为指向结构体的指针的问题 #include #include struct student { int num; char name[10]; struct student *next; ...

  2. linux rewind函数,C语言rewind()函数:将文件指针重新指向文件开头

    头文件:#include rewind()函数用于将文件指针重新指向文件的开头,同时清除和文件流相关的错误和eof标记,相当于调用fseek(stream, 0, SEEK_SET),其原型如下: v ...

  3. C语言学习笔记--预编译/宏定义/数组/参数传递/函数指针

    目录 预编译 值传递.指针传递.引用传递 数组 typedef 函数指针 预编译 预编译又叫预处理.预编译不是编译,而是编译前的处理.这个操作是在正式编译之前由系统自动完成的.#define 和 #i ...

  4. 让指针指向初始位置c语言,初始C语言中的指针(翁凯男神MOOC)

    运算符  & ●scanf("%d",&i); ●获得变量的地址,它的操作数必须是变量 ● int i; printf("%x",&i) ...

  5. 【C 语言】二级指针案例 ( 字符串切割 | 返回 自定义二级指针 作为结果 | 每个 一级指针 指向不同大小内存 | 精准分配每个 一级指针 指向的内存大小 )

    文章目录 一.二级指针案例 ( 返回自定义二级指针 | 精准控制内存大小 ) 二.完整代码示例 一.二级指针案例 ( 返回自定义二级指针 | 精准控制内存大小 ) 博客 [C 语言]二级指针案例 ( ...

  6. c语言fgetpos的参数,C语言fgetpos()函数:获得当前文件的读写指针(转)

    头文件:#include fgetpos()函数获得当前文件的指针所指的位置,并把该指针所指的位置信息存放到pos所指的对象中.pos以内部格式存储,仅由fgetpos()和fsetpos()使用.f ...

  7. c语言指针自定义函数,c语言函数指针定义,指针函数和函数指针的区别

    往往,我们一提到指针函数和函数指针的时候,就有很多人弄不懂.下面就由小编详细为大家介绍C语言中函数指针,指针函数和函数指针之间的区别. c语言指针函数定义: 函数指针是指向函数的指针变量. 因此&qu ...

  8. 【C语言进阶深度学习记录】三十二 函数指针与使用函数指针实现回调函数

    回调函数是非常重要的概念 文章目录 1 函数的类型 2 函数指针 2.1 函数指针的使用 2.2 使用函数指针实现回调函数 3 总结 1 函数的类型 跟以前学数组的时候是一样的,C语言中的数组是有自己 ...

  9. c语言数组宏定义标识符,C语言学习笔记--预编译/宏定义/数组/参数传递/函数指针...

    目录 预编译 值传递.指针传递.引用传递 数组 typedef 函数指针 预编译 预编译又叫预处理.预编译不是编译,而是编译前的处理.这个操作是在正式编译之前由系统自动完成的.#define 和 #i ...

最新文章

  1. C# PictureBox加载图片并显示进度条
  2. 李宏毅线性代数笔记9:特征值与特征向量
  3. mysql 定时器概念_MySQL 定时器
  4. 用回车键实现MFC对话框中TAB键控件输入焦点在控件中跳转的效果(转)
  5. Linux内核源码分析--内核启动之(2)Image内核启动(汇编部分)(Linux-3.0 ARMv7)
  6. java mongodb 条件查询_java实现如下条件的mongodb查询
  7. textarea 滚动条设置
  8. 魔兽世界模型浏览器WowModelExplorer演示
  9. 网络工程师--网络安全与应用案例分析
  10. 文献解读|DPP-4i治疗诱导的肠道微生物群的改变可改善葡萄糖稳态
  11. python爬虫论文总结与展望怎么写_论文总结与展望怎么写?
  12. 谈谈 .NET Reflector
  13. 【coppeliasim】高效传送带
  14. 计算机维修工在哪考,了如指掌:计算机维修工证报名考试时间——报名入口
  15. 关于Fortify 代码安全扫描常见问题
  16. python版FlappyBird代码解析
  17. 极限学习机(Extreme Learning Machine)ELM
  18. 推荐算法(推广搜)——广告和推荐有什么不同?
  19. 我本以为你们会写简历
  20. 西南大学计算机科学与技术专业在哪个校区,西南大学有几个校区及校区地址 哪个校区最好...

热门文章

  1. 大数据开发学习过程中的一些经验总结
  2. eclipse的安装以及JAVA的基本学习第一部分
  3. 最快速读取手机通讯录中联系人信息
  4. 编译报错: undefined reference to `pcl::console::print(pcl::console::VERBOSITY_LEVEL, char const*, ...)‘
  5. 小禾帮9月7日升级公告
  6. 怎样在百度地图上标注上自己公司的名称使别人能在搜索百度地图的同时在地图上能看见本公司地址?
  7. 解决Adobe Dreamweaver 2020在编程敲代码时又卡又慢延迟的问题(复制黏贴打字都卡)
  8. 【领峰交易争霸赛·第二季】4月27日启动报名,实盘PK,每天赢奖金
  9. 莫尔斯电码c语言编程教程,翻译莫尔斯电码
  10. Adblock浏览器插件屏蔽百度热搜