注:部分来源于网络相关资料,用于个人总结学习记录,如有侵权,请联删。
参考链接:https://blog.csdn.net/u010280075/article/details/88914424
1、指针作为函数的参数
指针最重要的应用是作为函数参数,它使得被调函数除了返回值之外,能够将更多的运算结果返回到主调函数中。指针是函数参数传递的重要工具
函数形参可以是指针类型,一般形式为:
![](https://img-blog.csdnimg.cn/img_convert/2c0f2e4fa04751be51d86f42597d5ebb.png)
通过指针作为函数参数的方法,既可以返回多个运算结果,又避免了使用全局变量
举例:
计算a和b的平方、自然对数和、几何平均数、和的平方根
![](https://img-blog.csdnimg.cn/img_convert/68662c0f96f47426927bebebe3603cc0.png)
2、数组作为函数的参数
(1)数组作为参数的形参
![](https://img-blog.csdnimg.cn/img_convert/74a6610f822faefda5052fcc8c7f2030.png)
函数调用形式如下:
![](https://img-blog.csdnimg.cn/img_convert/3b97ae64f9d4ce3fff75dc40f5541f59.png)
3、引用概念和规则
简单地说,引用就是一个对象的别名,声明形式为:
![](https://img-blog.csdnimg.cn/img_convert/6496c11728e0a5776f50ea230a1f8091.png)
在c++中,引用全部都是const类型,声明之后不可更改,即不能再是别的对象的引用
引用的规则:
(1)声明一个引用类型变量时,必须同时初始化它,声明他是哪个对象的别名,即绑定对象,例如:
![](https://img-blog.csdnimg.cn/img_convert/fb999389eabb40a514d3a0731d202f36.png)
(2)不能有空引用,引用必须与有效对象的内存单元关联
(3)引用一旦被初始化,就不能改变引用关系,不能再作为其他对象的引用,例如:
![](https://img-blog.csdnimg.cn/img_convert/ebe4362266506962c752d90cd588d3fe.png)
(4)指定类型的引用不能初始化到其他了类型的对象上,例如:
![](https://img-blog.csdnimg.cn/img_convert/8eaa67ecbf6c74f3e39d3f6b1572da9a.png)
(5)引用初始化与对引用赋值含义完全不同,例如:
![](https://img-blog.csdnimg.cn/img_convert/691b34ed48417767a65546de926d841a.png)
(6)取一个引用的地址和取一个对象的地址完全一样,都是用取地址运算符&。例如:
![](https://img-blog.csdnimg.cn/img_convert/432ea3efa4efddd49737a6d5361d0243.png)
4、引用作为函数形参
c++之所以扩充引用类型,主要是把它作为函数形参,使得c++中给一个函数传递参数有三种方法:
(1)传递对象本身
(2)传递指向对象的指针
(3)传递对象的引用
三种方法的比较:
![](https://img-blog.csdnimg.cn/img_convert/196fcdb53e153f4884be141e8545bc28.png)
![](https://img-blog.csdnimg.cn/img_convert/d0bc301562c032db17837008af1ac00d.png)
![](https://img-blog.csdnimg.cn/img_convert/e80bda1f717ef028b266f09b193d9a0a.png)
使用引用作为函数形参,比使用指针变量简单、直观、方便,特别是避免了在被调函数中出现大量指针间接访问的情况。
5、引用作为函数返回值
函数的返回值可以是引用类型,即函数返回引用,其定义形式为:
![](https://img-blog.csdnimg.cn/img_convert/0cf90ff17c44bcd53437af1a74ef5e9b.png)
函数返回值是一个指针:
![](https://img-blog.csdnimg.cn/img_convert/e03252f6dbb8996dfe5734a1d68a8496.png)
函数返回引用:
![](https://img-blog.csdnimg.cn/img_convert/821390723259fb42df96c68973849526.png)
可以看出,函数返回引用与函数返回值有重大区别,它不是返回一个临时对象,而是相当于返回实体对象本身。正因为如此,函数返回引用可以作为左值。例如:
int &fun(int &a,int &b )
{
return (a>b?a:b);
}
int main()
{
int x = 10, y=20,z=5;
fun(x,y) = z;
cout << y << endl;
}
执行结果:
5
6、指向函数的指针
函数是实现特定功能的程序代码的集合,实际上,函数代码在内存中也要占据一段内存空间(代码区内),这段存储空间的起始地址称为函数入口地址。c++规定函数入口地址为函数的指针,即函数名既代表函数,也是函数的指针(或者地址)。
c++允许定义指向函数的指针变量,定义形式为:
![](https://img-blog.csdnimg.cn/img_convert/8a82549b3c7d2922517972835df12fa5.png)
它可以指向如下形式的函数:
![](https://img-blog.csdnimg.cn/img_convert/4d0cc51a91564337be8a0244be363719.png)
函数指针如何指向函数:
可以将函数的地址赋值给函数指针变量,形式为:
函数指针变量 = 函数名;
要求函数指针变量与指向函数必须有相同的返回类型,参数个数,参数类型。
例如假如:
![](https://img-blog.csdnimg.cn/img_convert/94c1577ba396adca09f351f52daa91c0.png)
若p = max;则称p指向函数max。它也可以指向函数min,即可以指向所有与它有相同的返回类型、参数个数、参数类型的函数。
7、函数指针调用函数和回调函数
对函数指针间接引用即是通过函数指针调用函数,一般形式为:
函数指针(实参列表)
通过函数指针调用函数,在实参、参数传递、返回值等方面与函数名调用相同,例如:
![](https://img-blog.csdnimg.cn/img_convert/a3bcd3442834ace17afe26219b720d46.png)
指针函数用途:
指向函数的指针多用于指向不同的函数,从而可以利用指针变量调用不同函数,相当于将函数调用由静态方式(固定地调用指定函数)变为动态方式(调用那个函数是由指针值来确定)。熟练掌握函数指针的应用,有利于程序的模块化设计,提高程序的可扩展性。
举例:
回调函数
#include<stdio.h>
#include<stdlib.h>
//函数功能:实现累加求和
int func_sum(int n)
{
int sum = 0;
if (n < 0)
{
printf("n must be > 0\n");
exit(-1);
}
for (int i = 0; i < n; i++)
{
sum += i;
}
return sum;
}
//这个函数是回调函数,其中第二个参数为一个函数指针,通过该函数指针来调用求和函数,并把结果返回给主调函数
int callback(int n, int (*p)(int))
{
return p(n);
}
int main(void)
{
int n = 0;
printf("please input number:");
scanf("%d", &n);
printf("the sum from 0 to %d is %d\n", n, callback(n, func_sum)); //此处直接调用回调函数,而不是直接调用func_sum函数
return 0;
}
在这个程序中,回调函数callback无需关心func_sum是怎么实现的,只需要去调用即可。
这样的好处就是,如果以后对求和函数有优化,比如新写了个func_sum2函数的实现,我们只需要在调用回调函数的地方将函数指针指向func_sum2即可,而无需去修改callback函数内部。