1.函数指针的定义
2.函数指针的使用
3.函数指针数组数组的使用
1. 函数指针的定义,函数指针顾名思义,从变量指针是指向变量的一个指针这一定义可以推知,函数指针即为指向函数的 一个指针。
对于这个概念的理解可以按照这个步骤:函数指针是与变量指针相同的事物,即它也是一个指针,既然是指针,则必定是一个变量。
函数在被声明、实现之后系统会为其分配一块用来存放函数的代码的内存空间,而在系统中用来存放该代码段的起始地址是由函数指针所指向的,
而函数指针是指针,而我们在学习指针的时候被明确的被告知,指针 = 地址,那么这个函数指针也是一个地址,特殊一些它是指向实现了该函数的
代码段的起始地址,而起始地址就是我们常说的函数入口。
在一个程序中来创建函数指针的语句如下
void (*funcP) ();
这个是用来定义一个函数指针,该指针所指向的是返回值是 void 且不接收任何参数类型的函数。
2.函数指针的使用
//fPointer.cpp
//g++ fPointer.cpp -o fpointer
//./fpointer
#include <iostream>
#include <cstdio>
using namespace std ;
/**
first we define a function with the function signature as
return type :void
parameter number :1
parameter type : char **
function : display input contents
*/
void func( char **s )
{
cout<<"in func content "<<endl ;
printf("%s" , *s) ;
}
int main ( int argc , char *argv [] )
{
void (*fp) (char**) ; //define a function pointer ,
char *line ;
fp = func ; //initial the function pointer
cout<<"input a line"<<endl;
scanf("%s" , line ) ;
(*fp)(&line) ; //use function pointer call the function object
return 0 ;
}
3.函数指针数组数组的使用
首先,介绍一下 存放函数指针数组的定义:
void (*fpArray [10] ) ( int ) ;
上面的声明语句是用来声明一个这样的数组,该数组的名字叫做 fpArray,该数组中所存放的元素有10个,类型是函数指针,
该数组中所存放的函数指针所指向的函数类型是 以int 类型为传入参数类型,并且仅接受一个参数,该函数的返回值为 void 。
有了上面函数指针定义方式和这里的函数指针数组的定义方式我们在这里测试一下:
3.1 void* (* (*fp1)(int) ) [10] ;
这条语句定义的是一个函数指针 fp1 ,该指针所指向的函数是传入参数是一个整型变量,返回值是一个指针,
该指针指向的是存放着10 个void*类型变量的数组。 即返回的是指向一个数组的指针,数组中元素的类型是 void *.
3.2 float (* (*fp2) ( int ,int, float) ) (int) ;
这条语句所定义的是一个函数指针,该函数指针所指向的函数类型是这样的:传入参数列表是 (int , int , float ) ,函数的返回值
是一个函数指针,该作为返回值的函数指针所指向的函数类型是:传入参数列表是(int ) ,函数的返回值是 float 。
即函数指针fp2 所指向的函数的返回值也是一个函数指针。
3.3 int (* (*fp3() ) [10] ) () ;
这条语句所定义的是一个 fp3 的函数指针,fp3函数指针所指向的函数的类型是: 并不接收任何传入参数, 函数的返回值是一个数组指针,
该数组指针所指向的数组所存储的元素类型是函数指针,该指针所指向的数组的长度是10 。
该数组中的函数指针所指向的函数类型是: 不接收任何传入参数,并且函数的返回值是int 。
3.4 int (* (* fp4() ) [10] ) () ;
这条语句与上面的一样,但是通常情况下,我们都习惯将函数指针在定义的时候将其定义为一个变量类型(type),
通过该类型来定义变量实例(variable)。
所以上述的声明语句我们将其这样来写:
typedef int (* (* (*fp4)() )[10] ) () ;
fp4 funcPointer ;
// fPointerArray.cpp
// g++ fPointerArray.cpp -o fPointerArray
// ./fPointerArray
#include <iostream>
#include <cstdio>
using namespace std ;
char line [][10] ={"inuyasha","naruto" ,"natsume","misaki" ,"sakura" ,"kagome"} ;
//here we intialize a table for myFunc visiting
/**
myFunc shows contents stored in the line list by taking argument
as location number
*/
void myFunc ( int N )
{
printf("%s \n ", line[N] ) ;
}
int main ( int argc , char *argv [] )
{
int no ;
void (*fp_table[10]) (int) ;
//here we define an array which contains 10 elements in it
for ( int i = 0 ;i < 6; i++ )
{
fp_table[i] = myFunc ;
//initialize the function pointers stored in array fp_table
}
for ( int i = 5; i >=0 ; i-- )
{
(*fp_table[i]) (i) ;
//call function by calling the function pointers stored in
//fp_table and sending cycle control number i as function's argument
}
return 0;
}
不足与改进:
对于使用 typedef 来创建函数指针以及存放函数指针的数组的使用方法还没有进行试验,对其概念的了理解还不够。
后一个程序中数组中的所有函数指针仅仅指向同一个函数,如果能够实现指向有着相同返回值和参数列表的不同函数会更好。
如果将将要使用函数指针指向的函数使用宏定义的方式来创建更好。