提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
函数和指向函数的指针
一、c++函数
使用C++函数的过程:
提供函数定义;
提供函数原型;
调用函数;
typeName functionName(parameterList)
{
statements
return values;
}
void functionName(parameterList)
{
statement(s)
return;
}
1.原型的作用
原型描述了函数到编译器的接口,它将函数返回值的类型以及参数的类型和数量告诉编译器。
2.函数参数和按值传递
接受传递至的变量被称为形参,传递给函数的值被称为实参。
3.函数和数组
函数和数组的结合
int sum_arr(int arr[],int n)
方括号为空则表明,可以将任何长度的数组传递给该函数。但arr其实是指针,但可以看作数组。
可以用int *arr替换 int arr[],但是只能在函数头或者函数原型中才可以。都意味着一个指针,但是数组表示法,提醒还指向数组的第一个int
而当指针指向独立一个值的时,使用指针表示法。
//数组处理函数的常用编写方式
void f_modify(double ar[],int n);
void _f_no_change(const double ar[],int n);
4.函数与二维数组
5. 函数与C-风格字符串
6.函数和结构
7.函数和string对象
8.函数和array对象
二,函数指针
与数据项相似,函数也有地址。函数的地址是存储其机器语言代码的内存的开始地址。
声明指向某种数据类型的指针时,必须指定指针指向的类型。
同样,声明指向函数的指针时,也必须指定指针指向的函数类型。
//函数原型
double pam(int);
//指针类型声明
double (*pf)(int);
//(*pf)是函数,pf是函数指针。
若无括号 double *pf(int)则意味着pf()是一个返回指针的函数。
函数指针使用示例
double pam(int);
double (*pf)(int);
pf = pam;
void estimate(int lines,double (*pf)(int));
estimate(50,pam);
//编写原型困难,但是传递地址简单
引用:
为什么要使用函数指针?
那么,有不少人就觉得,本来很简单的函数调用,搞那么复杂干什么?其实在这样比较简单的代码实现中不容易看出来,当项目比较大,代码变得复杂了以后,函数指针就体现出了其优越性。
举个例子,如果我们要实现数组的排序,我们知道,常用的数组排序方法有很多种,比如快排,插入排序,冒泡排序,选择排序等,如果不管内部实现,你会发现,除了函数名不一样之外,返回值,包括函数入参都是相同的,这时候如果要调用不同的排序方法,就可以使用指针函数来实现,我们只需要修改函数指针初始化的地方,而不需要去修改每个调用的地方(特别是当调用特别频繁的时候)。
回调函数
函数指针的一个非常典型的应用就是回调函数。
什么是回调函数?
回调函数就是一个通过指针函数调用的函数。其将函数指针作为一个参数,传递给另一个函数。
回调函数并不是由实现方直接调用,而是在特定的事件或条件发生时由另外一方来调用的。
同样我们来看一个回调函数的例子:
————————————————
版权声明:本文为优快云博主「chenyc4」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/u010280075/article/details/88914424