用指针作函数参数
作用
- 使实参与形参指针指向共同的内存空间,达到双向传递的目的。(引用也可达到同样的效果)
- 减少函数调用时数据的开销
- 通过指向函数的指针传递函数代码首地址。
例:输入三个浮点数,分离出整数部分和小数部分。
#include<iostream>
using namespace std;
void splitfloat(float x, int* intpart, float* floatpart)
{
*intpart = int(x);
*floatpart = x - *intpart;
}
int main()
{
for (int i = 0; i < 3; i++)
{
float x, f;
int n;
cin >> x;
splitfloat(x, &n, &f);
cout << n << " " << f << endl;
}
return 0;
}
使用指针作为形参将整数变量和小数变量的地址传给指针,在函数内部对两个地址的内容进行修改后,主函数中的变量的值就被修改了。
如果函数体不需要通过指针改变指针所指向的内容的值时,在参数表中将它声明为指向常量的指针。
指针型函数
函数的返回值是指针,这个函数就是指针类型的函数
语法形式
存储类型 数据类型 *函数名()
{//函数体语句
}
数据类型表示函数返回指针的类型;函数名和*标识了一个指针型函数;参数表中是函数的形参列表。
注:
- 不要将非静态局部地址作为函数的返回值。
- 返回的指针要确保在主调函数中是合法有效的地址。
例 正确使用
- 主函数中定义的数组,在子函数中进行某种操作后,返回一个元素的地址,就是合法地址。
- 在子函数通过动态内存分配new取得的内存地址返回给主函数是合法有效的,但内存分配和释放不在同一级别,要注意不能忘记释放,避免内存泄露。
指向函数的指针
函数指针指向的是程序代码储存区
声明一个函数指针时,也需要说明函数的返回值、形参列表。
数据类型 (* 函数指针名) (形参表)
函数指针在使用前一定要进行赋值,使指针指向一个已经存在代码的起始地址。函数指针名=函数名
等号右边的函数名必须是一个已经声明过的、和函数指针具有相同返回类型和相同参数表的函数。
作用:实现函数回调
相当于一个大的容器里面包含了多种函数,想用什么函数,就取对应函数的首地址去调用它实现功能。
例:编写一个计算函数compute,对两个整数进行各种计算。有一个形参为指向具体算
法函数的指针,根据不同的实参函数,用不同的算法进行计算
编写三个函数:求两个整数的最大值、最小值、和。分别用这三个函数作为实参,测
试compute函数
#include <iostream>
using namespace std;
int compute(int a, int b, int(*func)(int, int))
{ return func(a, b);}
int max(int a, int b) // 求最大值
{ return ((a > b) ? a: b);}
int min(int a, int b) // 求最小值
{ return ((a < b) ? a: b);}
int sum(int a, int b) // 求和
{ return a + b;}
int main()
{
int a, b, res;
cout << "请输入整数a:"; cin >> a;
cout << "请输入整数b:"; cin >> b;
res = compute(a, b, & max);
cout << "Max of " << a << " and " << b << " is " << res << endl;
res = compute(a, b, & min);
cout << "Min of " << a << " and " << b << " is " << res << endl;
res = compute(a, b, & sum);
cout << "Sum of " << a << " and " << b << " is " << res << endl;
}
主函数中将max函数的地址传递后进入compute函数,再调用到具体的max函数。使得在处理类似事件时可以灵活调用不同的方法。而且调用者不关心谁是被调用者compute,需要知道存在一个特定原型和限制条件的被调用函数max。