函数指针与函数指针数组的使⽤⽅法
函数指针与函数指针数组的使⽤⽅法
函数指针:
函数指针包含函数在内存中的地址。数组名实际上就是数组的第⼀个元素在内存中的地址,类似地,函数名实际上也是执⾏这个函数任务的代码在内存中的起始地址。
函数指针可以传递给函数、从函数返回、保存在数组中、赋予另⼀个函数指针或者调⽤底层函数。
下⾯我们⽤数值算法accumulate讨论下函数指针的⽤法。accumulate是⼀种常⽤的STL数学算法。
std::accumulate(v.begin(),v.end(),0);是对v中从v.begin()开始,直到v.end()(但不包括这个位置)范围内的元素求和。
这个函数的第⼆个版本的第四个实参是⼀个通⽤函数,它确定了如何对元素求和。这个通⽤函数必须带两个实参并返回⼀个结果。第⼀个实参是和的当前值,第⼆个实参是序列中被求和的当前元素的值。
许多STL算法允许将函数指针传递到算法中,以帮助算法执⾏任务。
下⾯demo使⽤函数指针演⽰了accumulate函数。
#include <iostream>
#include <vector>
#include <algorithm>        //copy算法
#include <numeric>          //accumulate算法
#include <functional>
#include <iterator>            //输出迭代器
using namespace std;
//定义sumSquares函数,它计算第⼆个实参value的平⽅,并将结果和第⼀个实参相加,返回⼆者之和。
int sumSquares(int total,int value)
{
return total + value*value;
}
int _tmain(int argc, _TCHAR* argv[])
{
const int SIZE = 10;
int array[SIZE] = {1,2,3,4,5,6,7,8,9,10};
vector<int> integers(array,array+SIZE);    //元素拷贝
ostream_iterator<int> output(cout," ");
int result;
指针函数的作用cout<<"vector integers contains:\n";
copy(integers.begin(),d(),output);
/
/accumulate函数将它所迭代的序列的每个元素作为第⼆个实参传递给sumSquares函数
//第⼀次调⽤sumSquares函数时,第⼀个实参是total的初始值(作为accumulate的第三个实参提供,在这个例⼦中为0)
//在sumSquares函数的所有后续调⽤中,传给它的第⼀个实参是前⼀次调⽤sumSquares时所返回的当前和。
//当accumulate结束时,它返回序列中所有元素的平⽅和。
result = accumulate(integers.begin(),d(),0,sumSquares);//⽤⼀个指向sumSquares的函数指针作为最后⼀个实参调⽤accumulate函数
cout<<"\n\nSum of square of element in integers using "
<<"binary\nfuncion sunSquare: "<<result;
cout<<endl;
system("pause");
return 0;
}
运⾏结果:
函数指针与函数返回指针区别:
例如:
Void selectionSort(int work[],const int size,bool(*compare)(int,int))
在上⾯selectionSort的函数中出现了参数bool(*compare)(int,int)
这个参数指定⼀个函数指针。关键之bool表明被指向的函数返回⼀个bool值。
⽂本(*compare)表⽰这个函数指针的名称(*表明参数compare是⼀个指针)。
⽂本“(int,int)”表⽰compare指向的函数接受两个整形实参。
“*compare”两边的圆括号是必须的,它表⽰compare是⼀个函数指针。
如果没有圆括号,则声明变成bool *compare(int,int)
它声明了⼀个函数,这个函数接收两个整数作为参数,并返回⼀个指向bool值的指针。
函数指针数组
函数指针的⼀个⽤法出现在菜单驱动系统中。例如程序可以提⽰⽤户输⼊⼀个整数值来选择菜单中的⼀个选项。⽤户的选择可以做函数指针数组的下标,⽽数组中的指针可以⽤来调⽤函数。
下⾯的demo提供了⼀个机械的例⼦,它演⽰了函数指针数组的声明和使⽤。在程序中定义了3个函数:function0, function1和
function2,每个函数都带⼀个整形实参,并且不返回任何值。
#include <iostream>
using namespace std;
void function0(int);
void function1(int);
void function2(int);
int _tmain(int argc, _TCHAR* argv[])
{
void (*f[3])(int) = {function0,function1,function2};  //将这3个函数指针保存在数组f中
int choice;
cout << "Enter a number between 0 and 2,3 to end: ";
cin >> choice;
//处理⽤户的选择
while ((choice >= 0) && (choice <3))
{
//调⽤数组f中的⼀个函数
(*f[choice])(choice);  //f[choice]选择在数组中位置为choice的指针。
//指针被解除引⽤,以调⽤函数,并且choice作为实参传递给这个函数。
cout << "Enter a number between 0 and 2,3 to end: ";
cin >> choice;
}
cout << "Program execution completed." << endl;
system("pause");
return 0;
}
void function0(int a)
{
cout << "You entered" << a << " so function0 was called\n\n";
}
void function1(int b)
{
cout << "You entered" << b << " so function0 was called\n\n";
}
void function2(int c)
{
cout << "You entered" << c << " so function0 was called\n\n";
}
运⾏结果:
参考资料:<<c++程序员教程>>  电⼦⼯业出版社  张良华等 译    P232-236,P581-583,P600-602

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。