1.指针函数

指针函数,从名字上看它本质上是一个函数。

指针函数:返回值类型是指针的函数。函数声明如下:


int *plusfunction(int a,int b);

当然也可以写成如下格式:


int* plusfunction(int a,int b);

指针标志 * 与int  紧贴在一起,而与函数名f间隔开,这样看起来就明了些了,plusfunction是函数名,返回值类型是一个int类型的指针。

指针函数就是一个普通的函数,普通到仅仅是因为它的函数返回值是指针而已。这和上面那个函数唯一的区别就是在函数名前面多了一个*号,而这个函数就是一个指针函数。其返回值是一个 int 类型的指针,是一个地址。

//指针函数,从名字上看它本质上是一个函数。
//指针函数:返回值类型是指针的函数。#include <stdio.h>
#include <stdlib.h>
int* plusfunction(int a, int b);
int main()
{int *p = NULL;p = plusfunction(1, 2);printf("*p is %d\n", *p);free (p);system("pause");return 0;
}int* plusfunction(int a, int b)
{int *p = (int *)malloc(sizeof(int));*p = a + b;return  p;
}

不过我有个疑问,使用指针函数,和函数入参是指针,这两者对比使用,第一种方法有什么好处呢???

下面展示函数入参是指针

#include <stdio.h>
#include <stdlib.h>
void plusfunction(int a, int b, int *p);
int main()
{int *p = NULL;p = (int *)malloc(sizeof(int));plusfunction(1, 8, p);printf("*p is %d\n", *p);free(p);system("pause");return 0;
}void plusfunction(int a, int b, int *p)
{*p = a + b;
}

这样执行也是没问题的啊,日常开发中,我还真没找到指针函数的“优点”,让我觉得某个功能必须用指针函数实现,或用指针函数实现后代码更整洁,提高代码可读性。

2.函数指针

函数指针,本质上他是一个指针,并不是一个函数。在C语言中有些概念是一脉相承的。

函数指针说的就是一个指针,但这个指针指向的是函数,不是普通的基本数据类型或者类对象。函数指针定义如下:


int (*f)(int a,int b);//声明函数指针

和指针函数的定义对比可以看到,

函数指针与指针函数的最大区别是函数指针的函数名是一个指针,即函数名前面有一个指针类型的标志型号“*”。

注意指针函数与函数指针表示方法的不同,千万不要混淆。

最简单的辨别方式就是看函数名前面的指针*号有没有被括号()包含,如果被包含就是函数指针,反之则是指针函数。

当然,函数指针的返回值也可以是指针。


#include <stdio.h>
void MyFun(int a);
int main()
{MyFun(10);return(0);
}
void MyFun(int a)
{printf("a is %d\n",a);
}

#include <stdio.h>
#include<stdlib.h>
void MyFun(int a);
int main()
{(*MyFun)(10);system("pause");return 0;
}
void MyFun(int a)
{printf("a is %d\n", a);
}

这个代码是正常运行的,也就是说(*MyFun)(10);和MyFun(10);是一样的,在教材和资料中,都会讲到数组名就是指向数组第一个数据的常量指针。从上面例子看到,函数名貌似也是“常量指针”


#include <stdio.h>
#include<stdlib.h>
void MyFun(int a);// 这个声明也可写成:void MyFun( int )
void(*FunP)(int);//也可声明成void(*FunP)(int x),但习惯上一般不这样。
int main()
{FunP = MyFun;(*FunP)(100);system("pause");return 0;
}
void MyFun(int a)
{printf("a is %d\n", a);
}

#include <stdio.h>
#include<stdlib.h>
void MyFun(int a);// 这个声明也可写成:void MyFun( int )
void(*FunP)(int);//也可声明成void(*FunP)(int x),但习惯上一般不这样。
int main()
{FunP = MyFun;FunP(100);system("pause");return 0;
}
void MyFun(int a)
{printf("a is %d\n", a);
}

是的,将FunP前面的*号拿掉也是可以运行的,上面的示例代码就是函数指针在C语言中的最常见形态。之前的例子只是为了让你更能理解函数指针,实际开发中只需要用函数指针的最终,最常见的形态即可。

不然代码中出现之前的形式,其他程序员并不是很熟悉,就成了“骚操作”,虽然不影响运行,但是降低代码的可阅读性。

既然函数指针变量是一个变量,当然也可以作为某个函数的参数来使用的。所以,你还应知道函数指针是如何作为某个函数的参数来传递使用的。

回调函数(以函数指针为参数的函数)

C++笔记 指针函数与函数指针详解相关推荐

  1. Delphi Format函数功能及用法详解

    DELPHI中Format函数功能及用法详解 DELPHI中Format函数功能及用法详解function Format(const Format: string; const Args: array ...

  2. c语言指针用法及实际应用详解,通俗易懂超详细

    c语言指针用法及实际应用详解,通俗易懂超详细! \\\插播一条:文章末尾有惊喜哟~/// 今天给大家来讲解一下指针. 我会由浅到深,最后联合实际应用讲解,让大家学会指针的同时,知道大佬们都用指针来干嘛 ...

  3. 互斥量、条件变量与pthread_cond_wait()函数的使用,详解(二)

    互斥量.条件变量与pthread_cond_wait()函数的使用,详解(二) 1.Linux"线程" 进程与线程之间是有区别的,不过linux内核只提供了轻量进程的支持,未实现线 ...

  4. 在python中使用关键字define定义函数_python自定义函数def的应用详解

    这里是三岁,来和大家唠唠自定义函数,这一个神奇的东西,带大家白话玩转自定义函数 自定义函数,编程里面的精髓! def 自定义函数的必要函数:def 使用方法:def 函数名(参数1,参数2,参数-): ...

  5. 函数assert()详解

    函数assert()详解: 断言assert是一个宏,该宏在<assert>中,,当使用assert时候,给他个参数,即一个判读为真的表达式.预处理器产生测试该断言的代码,如果断言不为真, ...

  6. php。defined,PHP defined()函数的使用图文详解

    PHP defined()函数的使用图文详解 PHP defined() 函数 例子 定义和用法 defined() 函数检查某常量是否存在. 若常量存在,则返回 true,否则返回 false. 语 ...

  7. python中tile的用法_python3中numpy函数tile的用法详解

    tile函数位于python模块 numpy.lib.shape_base中,他的功能是重复某个数组.比如tile(A,n),功能是将数组A重复n次,构成一个新的数组,我们还是使用具体的例子来说明问题 ...

  8. python中的json函数_python中装饰器、内置函数、json的详解

    装饰器 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象. 先看简单例子: def run(): time.sleep(1 ...

  9. php时间函数引入,PHP日期和时间函数的使用示例详解

    (1)查看日期函数拓展 phpinfo() phpinfo(); 打开上述页面之后,可以看到以下,证明已经安装日期拓展 浏览器输入php.net访问php的文档 (2)设置时区 方式一:修改配置文件p ...

  10. python def函数报错详解_python自定义函数def的应用详解

    这篇文章主要介绍了python自定义函数def的应用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 这里是三岁,来和大家唠唠 ...

最新文章

  1. JPEG图片扩展信息读取与改动
  2. Linux入门基础思维导图
  3. 安卓清理垃圾清理代码_用方面清理代码
  4. php 排序不影响索引,为什么不能通过索引避免排序操作呢??
  5. A4Desk 网站破解
  6. 计算机多重网络intnet,南昌大学计算机网络实验(全).doc
  7. POJ 3107 - Godfather
  8. Win7和win10下python3和python2同时安装并解决pip共存问题
  9. 每日一句 i'm by disposition one of life's neutrals,a human Switzerland
  10. 多功能通用报修管理平台后勤维修软件
  11. win10系统定时自动切换深色模式
  12. 服务器磁盘阵列数据恢复方法,两块硬盘离线恢复数据
  13. 华为路由器用Linux开发,华为路由交换设备配置综合实验(实验六合一)
  14. 三角函数在c语言中应用,三角函数在前端动画中的应用
  15. codecademy SQL lesson2
  16. mongoengine fields详解
  17. e431装linux系统恢复,Mac、Linux、Windows三系统的备份恢复以及引导修复思路记录
  18. git push 失败,提示:error: RPC failed; HTTP 411 curl 22 The requested URL returned error: 411
  19. 贪心算法(Greedy )
  20. 计算机人机交互接口论文,人机交互小论文

热门文章

  1. 简单卷、跨区卷、带区卷、镜像卷和…
  2. 一个非常是个程序员表白的浪漫网站(HTML+CSS+JS)
  3. 价值50元的图文很详细的装机教程
  4. SRC挖洞之SSRF与XXE漏洞的实战案例
  5. nova6se能升级鸿蒙,用的Nova4高配8+128,想换3000左右的手机求推荐?
  6. EXCEL中ADDRESS函数的使用
  7. 一个博客网站的历史纪录。。。
  8. 史上超级详细:java图片转二进制
  9. 优先队列(Python)
  10. 十分钟之内实现stack和queue?容器适配器是什么?priority_queue不是队列?