C++笔记 指针函数与函数指针详解
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++笔记 指针函数与函数指针详解相关推荐
- Delphi Format函数功能及用法详解
DELPHI中Format函数功能及用法详解 DELPHI中Format函数功能及用法详解function Format(const Format: string; const Args: array ...
- c语言指针用法及实际应用详解,通俗易懂超详细
c语言指针用法及实际应用详解,通俗易懂超详细! \\\插播一条:文章末尾有惊喜哟~/// 今天给大家来讲解一下指针. 我会由浅到深,最后联合实际应用讲解,让大家学会指针的同时,知道大佬们都用指针来干嘛 ...
- 互斥量、条件变量与pthread_cond_wait()函数的使用,详解(二)
互斥量.条件变量与pthread_cond_wait()函数的使用,详解(二) 1.Linux"线程" 进程与线程之间是有区别的,不过linux内核只提供了轻量进程的支持,未实现线 ...
- 在python中使用关键字define定义函数_python自定义函数def的应用详解
这里是三岁,来和大家唠唠自定义函数,这一个神奇的东西,带大家白话玩转自定义函数 自定义函数,编程里面的精髓! def 自定义函数的必要函数:def 使用方法:def 函数名(参数1,参数2,参数-): ...
- 函数assert()详解
函数assert()详解: 断言assert是一个宏,该宏在<assert>中,,当使用assert时候,给他个参数,即一个判读为真的表达式.预处理器产生测试该断言的代码,如果断言不为真, ...
- php。defined,PHP defined()函数的使用图文详解
PHP defined()函数的使用图文详解 PHP defined() 函数 例子 定义和用法 defined() 函数检查某常量是否存在. 若常量存在,则返回 true,否则返回 false. 语 ...
- python中tile的用法_python3中numpy函数tile的用法详解
tile函数位于python模块 numpy.lib.shape_base中,他的功能是重复某个数组.比如tile(A,n),功能是将数组A重复n次,构成一个新的数组,我们还是使用具体的例子来说明问题 ...
- python中的json函数_python中装饰器、内置函数、json的详解
装饰器 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象. 先看简单例子: def run(): time.sleep(1 ...
- php时间函数引入,PHP日期和时间函数的使用示例详解
(1)查看日期函数拓展 phpinfo() phpinfo(); 打开上述页面之后,可以看到以下,证明已经安装日期拓展 浏览器输入php.net访问php的文档 (2)设置时区 方式一:修改配置文件p ...
- python def函数报错详解_python自定义函数def的应用详解
这篇文章主要介绍了python自定义函数def的应用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 这里是三岁,来和大家唠唠 ...
最新文章
- JPEG图片扩展信息读取与改动
- Linux入门基础思维导图
- 安卓清理垃圾清理代码_用方面清理代码
- php 排序不影响索引,为什么不能通过索引避免排序操作呢??
- A4Desk 网站破解
- 计算机多重网络intnet,南昌大学计算机网络实验(全).doc
- POJ 3107 - Godfather
- Win7和win10下python3和python2同时安装并解决pip共存问题
- 每日一句 i'm by disposition one of life's neutrals,a human Switzerland
- 多功能通用报修管理平台后勤维修软件
- win10系统定时自动切换深色模式
- 服务器磁盘阵列数据恢复方法,两块硬盘离线恢复数据
- 华为路由器用Linux开发,华为路由交换设备配置综合实验(实验六合一)
- 三角函数在c语言中应用,三角函数在前端动画中的应用
- codecademy SQL lesson2
- mongoengine fields详解
- e431装linux系统恢复,Mac、Linux、Windows三系统的备份恢复以及引导修复思路记录
- git push 失败,提示:error: RPC failed; HTTP 411 curl 22 The requested URL returned error: 411
- 贪心算法(Greedy )
- 计算机人机交互接口论文,人机交互小论文