函数指针与函数指针数组的使用方法

转自:http://blog.csdn.net/feitianxuxue/article/details/7300291

函数指针与函数指针数组的使用方法

函数指针:

函数指针包含函数在内存中的地址。数组名实际上就是数组的第一个元素在内存中的地址,类似地,函数名实际上也是执行这个函数任务的代码在内存中的起始地址

函数指针可以传递给函数、从函数返回、保存在数组中、赋予另一个函数指针或者调用底层函数。

下面我们用数值算法accumulate讨论下函数指针的用法。accumulate是一种常用的STL数学算法。

std::accumulate(v.begin(),v.end(),0);是对v中从v.begin()开始,直到v.end()(但不包括这个位置)范围内的元素求和。

这个函数的第二个版本的第四个实参是一个通用函数,它确定了如何对元素求和。这个通用函数必须带两个实参并返回一个结果。第一个实参是和的当前值,第二个实参是序列中被求和的当前元素的值。

许多STL算法允许将函数指针传递到算法中,以帮助算法执行任务。

下面demo使用函数指针演示了accumulate函数。

 1 #include <iostream>
 2 #include <vector>
 3 #include <algorithm>         //copy算法
 4 #include <numeric>          //accumulate算法
 5 #include <functional>
 6 #include <iterator>            //输出迭代器
 7 using namespace std;
 8
 9 //定义sumSquares函数,它计算第二个实参value的平方,并将结果和第一个实参相加,返回二者之和。
10 int sumSquares(int total,int value)
11 {
12  return total + value*value;
13 }
14 int _tmain(int argc, _TCHAR* argv[])
15 {
16  const int SIZE = 10;
17  int array[SIZE] = {1,2,3,4,5,6,7,8,9,10};
18  vector<int> integers(array,array+SIZE);     //元素拷贝
19  ostream_iterator<int> output(cout," ");
20  int result;
21  cout<<"vector integers contains:\n";
22  copy(integers.begin(),integers.end(),output);
23
24  //accumulate函数将它所迭代的序列的每个元素作为第二个实参传递给sumSquares函数
25  //第一次调用sumSquares函数时,第一个实参是total的初始值(作为accumulate的第三个实参提供,在这个例子中为0)
26  //在sumSquares函数的所有后续调用中,传给它的第一个实参是前一次调用sumSquares时所返回的当前和。
27  //当accumulate结束时,它返回序列中所有元素的平方和。
28  result = accumulate(integers.begin(),integers.end(),0,sumSquares);//用一个指向sumSquares的函数指针作为最后一个实参调用accumulate函数
29
30  cout<<"\n\nSum of square of element in integers using "
31   <<"binary\nfuncion sunSquare: "<<result;
32
33  cout<<endl;
34  system("pause");
35  return 0;
36 }

运行结果:

函数指针与函数返回指针区别:

例如:

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,每个函数都带一个整形实参,并且不返回任何值。

 1 #include <iostream>
 2 using namespace std;
 3
 4 void function0(int);
 5 void function1(int);
 6 void function2(int);
 7
 8 int _tmain(int argc, _TCHAR* argv[])
 9 {
10  void (*f[3])(int) = {function0,function1,function2};  //将这3个函数指针保存在数组f中
11
12  int choice;
13
14  cout << "Enter a number between 0 and 2,3 to end: ";
15  cin >> choice;
16
17  //处理用户的选择
18  while ((choice >= 0) && (choice <3))
19  {
20   //调用数组f中的一个函数
21   (*f[choice])(choice);   //f[choice]选择在数组中位置为choice的指针。
22                          //指针被解除引用,以调用函数,并且choice作为实参传递给这个函数。
23   cout << "Enter a number between 0 and 2,3 to end: ";
24   cin >> choice;
25  }
26
27  cout << "Program execution completed." << endl;
28  system("pause");
29  return 0;
30 }
31
32 void function0(int a)
33 {
34  cout << "You entered" << a << " so function0 was called\n\n";
35 }
36
37 void function1(int b)
38 {
39  cout << "You entered" << b << " so function0 was called\n\n";
40 }
41
42 void function2(int c)
43 {
44  cout << "You entered" << c << " so function0 was called\n\n";
45 }

运行结果:

时间: 2024-11-08 18:57:19

函数指针与函数指针数组的使用方法的相关文章

C#委托与C语言函数指针及函数指针数组

C#委托与C语言函数指针及函数指针数组 在使用C#时总会为委托而感到疑惑,但现在总新温习了一遍C语言后,才真正理解的委托. 其实委托就类似于C/C++里的函数指针,在函数传参时传递的是函数指针,在调用的时候通过指针访问这个函数. 在C语言中函数指针的申明如下: //可以理解为申明一个指着变量 Func ,它的类型是 返回Type(可以为 void )类型的参数,接收 (Type one,Type two,...)类型的//参数(可以不接受参数). Type *Func(Type one,Type

qsort 函数的使用——对普通数组、指针数组、二维数组中的元素进行排序

在ANSI C中,qsort函数的原型是 #include <stdlib.h> void qsort(void *base, size_t nmemb, size_t size, int (*compar) (const void *, const void *)); 解释:qsort函数对含有nmemb个元素的数组进行排序,而base指针指向数组的第一个元素.这个数组的元素个数由size指定. compar函数对qsort的比较操作进行定义,所以可以定制数字的比较,字符串的比较,甚至结构体

深入理解 [指针函数] 、[函数指针]、[指针的指针]、[指向指针数组的指针]

指针函数 1.指针函数是指带指针的函数,即本质是一个函数.当一个函数声明其返回值为一个指针时,实际上就是返回一个地址给调用函数,以用于需要指针或地址的表达式中. 函数返回类型是某一类型的指针: 格式: 类型标识符  *函数名(参数表) int *match(void *key_x,void *key_y); 解析:首先来说它是一个函数,只不过这个函数的返回值是一个地址值.函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且,在主调函数中,函数返回值必须赋给同类型的指针

指针 指针与数组 指针与字符串 指针与函数 结构体与指针 宏

指针 指针与数组 指针与字符串 指针与函数?? 指针与数组 1.数组名:数组元素首地址 eg: int array[3]={1,3,6}; 这里array 恒等于&array[0] 2.int *p = a; int *p = 0; int a[]={0}; 3.int *p = a; 均指向数组的首地址 *p是? *(p+1)是?(*p)+1是? *(p+1)决定向下移动几个字节是类型 4.指针可以当数组名使用 p[1] = 3; 恒等于a[1] ;恒等于*(p+1);恒等于*(a+1) 5.

入职培训笔记记录--day9(1、指针函数与函数指针、函数指针数组 2、malloc memset 3、递归函数 4、结构体 5、共用体---》大小端 6、枚举)

1.指针函数与函数指针.函数指针数组 指针函数:返回值为指针的函数 char *fun() { char str[] = "hello world"; return str; } int main() { char *p = fun(); puts(p); return 0; } 编译时,会出现警告,返回了一个已经被释放掉的内存空间的首地址解决方法:1.static 2.char *str = "hello world"; 3.malloc 注意:使用完后要free

C++ —— 返回数组指针的函数

基础知识:数组不能被拷贝,函数不能返回数组,只能返回数组的指针或者引用. 定义一个 返回数组指针的函数 的方法,以 一个接收参数为 含有10个整型元素的数组的引用  和 返回一个含有10个整型元素的数组的指针 的函数为例. 法一:(不使用别名) int (*getCopyArr(int (&arr)[10]))[10] { int (*n)[10] = (int (*)[10])new int[10]; for (int i = 0; i < 10; i++) (*n)[i] = arr[i

数组和指针作为函数的参数

数组作为函数的参数 注意:当数组作为函数的实参时,只传递数组的地址,而不是将整个数组赋值到函数中,当用数组名作为实参调用函数时,指向该数组的第一个元素的指针就被传递到了函数中 C语言中没有下标的数组而是一个指向该数组第一个元素的指针 其实说的就是数组第一个元素的地址 如 int count [10];        count 就等同于 *count 都表示count数组 第一个元素的地址 1.数组的元素作为函数的参数 (需要用for循环来对数组中的元素进行遍历 让每一个元素都传入函数中)

c/c++ 函数、常量、指针和数组的关系梳理

压力才有动力,15年中旬就要准备实习,学习复习学习复习学习复习学习复习……无限循环中,好记性不如烂笔头……从数组开始,为主干. c 的array由一系列的类型相同的元素构成,数组声明包括数组元素个数和类型,c 中的数组参数是引用形式传参(传址调用),而常量标量是按值传递. //[]方括号表示声明的是数组,里面的数字表明了数组包含的元素数目 int states[50];//声明50个整数的数组 double code[365];//声明365个浮点数的数组 char chr[20];//声明20

解析 指针数组,数组指针,函数指针

一 :关于指针和堆的内存分配 指针数组 : 一个数组里放的都是指针,我们把他叫做指针数组 int * a[10]; 由于它是一个数组,他是不能从堆空间里申请空间的. 只能做个循环,每个元素去申请空间,或者每个元素去指向另外的地址空间. 数组指针 : 一个指向一唯或者多唯数组的指针: int * b=new int[10]; 指向一唯数组的指针b ; 一些例子: int (*b2)[10]=new int[10][10]; 注意,这里的b2指向了一个二唯int型数组的首地址. 注意,这里的b2的类