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

C语言【指针】函数指针和指针函数用法和区别

首先我们能先来看这两种概念的写法:

函数指针:int (*f)(int x,int y);

指针函数:int *f(int x,int y);

函数指针本质是一个指针,其指向一个函数。

指针函数本质是一个函数,其返回值为指针。

指针函数

定义

指针函数,简单的来说,就是一个返回指针的函数,其本质是一个函数,而该函数的返回值是一个指针。
声明格式为:*类型标识符 函数名(参数表) 

指针函数的写法

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

示例

对于指针函数来说:

它本身是一个函数,那么就和普通的函数一样会有一个返回值,普通函数的返回值就是一个数值,

例如下面这段代码的返回值是零

int f()
{
..............
return 0;} 

那么指针函数的返回值是一个指针,也就是一个地址

#include <stdio.h>
#include<stdlib.h> 
int c;
//这里定义add和sub都是指针函数,返回的都是一个指针即一个地址。
int * add(int x, int y)
{c=x + y;return &c;}
int * sub(int x, int y)
{c = x -y;return &c;}
/*这是一个指针函数*/
int * (*fdate)(int x,int y);
int main()
{printf("1+2= %d\n", *add(1, 2));//对指针函数取值 1+2= 3fdate= add;printf("1+2= %d\n", *(*fdate)(1, 2));//*fdate是对add取值*(*fdate)是对* (*fdate)取值 1+2= 3fdate= sub;printf("1-2= %d\n", *(*fdate)(1, 2));1-2= -1}

函数指针

定义

函数指针,其本质是一个指针变量,该指针指向这个函数。总结来说,函数指针就是指向函数的指针。
声明格式:类型说明符 (*函数名) (参数)

函数指针写法

如下:

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

函数指针是需要把一个函数的地址赋值给它,有两种写法:

fun = &Function;
fun = Function;

取地址运算符&不是必需的,因为一个函数标识符就表示了它的地址,如果是函数调用,还必须包含一个圆括号括起来的参数表。

函数指针的调用

调用函数指针的方式也有两种:

x = (*fun)();
x = fun();

两种方式均可,其中第二种看上去和普通的函数调用没啥区别,如果可以的话,建议使用第一种,因为可以清楚的指明这是通过指针的方式来调用函数

示例

#include <stdio.h>
#include<stdlib.h> 
int add(int x, int y)
{return x + y;}
int sub(int x, int y)
{return x - y;}
/*这是一个函数指针,因为()的优先级大于*的有限级,但是(*f)排在前边,所示这是一个指针,
函数指针就是一个指针,他和变量指针一样,指向的都是一个地址,例如变量指针(也就是我们常说的指针)指向的是这个变量的地址
而函数指针,指向的是这个函数的地址
*/
int (*f)(int x, int y);//定义了一个函数指针
int main()
{f = &add;//因为f是一个函数指针,也就是一个指针,那么就是一个地址,现在取函数add的地址赋给f,也就是函数f的功能等同于函数add的功能printf("1+2= %d\n",(*f)(1,2));f = &sub;printf("1-2= %d\n",(*f)(1,2));}

结果

1+2= 3
1-2= -1

http://www.xdnf.cn/news/828829.html

相关文章:

  • AGPS(辅助全球卫星定位系统)
  • 这些机房规划技巧,老网工都不舍得公开
  • android使用sharesdk第三方分享
  • 【C语言】C语言函数详解:从基础到高级,掌握函数的使用技巧和常见问题解析
  • sin60度 用计算机,cos60度等于多少啊
  • Java概念
  • Android最全UI库合集
  • C语言爱心代码大全集—会Ctrl+C就可以表白了
  • TCP通信过程详解以及tcp长连接和短连接
  • IronPython:交互式解释器与常用函数
  • VMware安装虚拟机教程(小白学习记录)
  • 入坑刷机?手机各大模式了解一下
  • AndroidStudio findbugs 插件检查和过滤
  • 配置本地安全策略
  • 计算机大端与小端的详细解析,含判断机器大小端代码
  • SAP-MM常用增强之MIGO增强
  • startActivityForResult被标记为弃用后,如何优雅的启动Activity?
  • 软件加密系统Themida应用程序保护指南(八):额外的选择
  • assertion failed的解决办法
  • 浅析C/C++ library
  • 三层架构简介
  • Oracle AWR与ASH性能报告深入解析
  • 中文乱码集锦
  • SpringBatch简介
  • 【Nav2中文网】十一、迁移指南 (三) Foxy转Galactic
  • 【Linux C | 文件I/O】文件的读写 | read、write、lseek 函数
  • 软件测试人员必备的60个测试工具,果断收藏了!
  • cFosSpeed(网络加速器软件)官方中文版V11.10.2483 | 网络优化大师 | 绝佳的电脑网络延迟解决方法
  • PubYun动态域名
  • 关于web应用开发