函数指针
函数指针和指针函数两个词很像,但实际上只要看后两个词就行,函数指针是一个指针,指针是用来存放变量地址的,函数指针存放的地址是函数的入口地址。那么函数指针如何使用呢,请看下面的代码:
#include <iostream>
using namespace std;
typedef double(*P)(double x);//将特定原型的函数指针类型typedef为P
double square(double x)
{
return x*x;
}
double cube(double x)
{
return x*x*x;
}
double calculus(double x1, double x2,P p)
{
double dx = 0.00000001;//积分步长
double sum = 0.0;//积分累计值
for (double x = x1; x <= x2-dx;x+=dx)
{
if (p(x)*p(x+dx)<0)
{
continue;
}
sum += dx*(p(x) + p(x + dx))*0.5;
}
return sum;
}
void main()
{
cout << calculus(0, 6, square) << endl;
cout << calculus(0,2, cube) << endl;
system("pause");
}
上面的代码中squre函数返回一个浮点数的平方,cube返回一个浮点数的立方,calculus用于计算一个函数的微积分,为了保证可以对一定区间的不同函数进行微积分计算,使用到了函数指针,所以main函数里第一次调用calculus函数时计算的是y=x^2在[0,6]区间的积分,第二次调用计算的是y=x^3在[0,2]区间的积分。顺便提一下函数指针还有另一种叫法叫回调函数。
指针函数
指针函数看后两个字,函数。其实指针函数也没啥特别的,只是它是一个返回值为指针类型的函数。不过返回值是指针的话有些地方要注意一下,不能把函数内声明的栈内存的地址返回。
错误示例:
#include <iostream>
using namespace std;
char* GetString()
{
char str[100];
strcpy(str, "abcdefg");
return str;
}
void main()
{
char* str = GetString();
cout << str << endl;
system("pause");
}
输出结果:
为什么会输出一堆“烫”呢,c语言中未初始化的内存会用0xcc填充,而0xcccc正好代表“烫”字,所以会输出一堆烫。因为函数中的数组用的是栈内存,在函数调用结束后会释放,所以返回栈内存的地址是没有用的,下面贴出正确的代码:
#include <iostream>
using namespace std;
char* GetString()
{
char *str = (char*)malloc(sizeof(char) * 100);
strcpy(str, "abcdefg");
return str;
}
void main()
{
char* str = GetString();
cout << str << endl;
delete str;
system("pause");
}
上面的代码在函数内动态分配了一块内存并将内存起始地址存入指针str中,当函数调用完后,堆内存不会被释放,因此能输出想要的结果,不过要记得手动释放申请的堆内存。
关于函数指针和指针函数的东西就总结这么多了,如果有错误还望指出感激不尽!