程序运行时,一个函数包括的指令序列(函数相当于一个指令集)要占据一段内存空间,这段内存空间的首字节的地址称为函数的入口地址,编译系统用函数名代表这一空间。
请看下面的示例
void show(const char * s1, const char *s2);
int main()
{
void (*func_ptr)(const char * s1, const char *s2);
func_ptr = show; //初始化func_ptr
func_ptr("good", "luck");
cout<<&func_ptr;
return 1;
}
void show(const char * s1, const char *s2)
{
cout<<s1<<"\n****\n"<<s2<<endl;
}
输出是
good
****
luck
0x6dfefc
这里定义了指针func_ptr
, 指向show()
函数,通过上述代码,我们可以知道函数指针的定义按照下面的语法:
<typename> (*variable_name) (format argument list);
当我们要给指针赋值时通过下面的方式
(*variable_name) = (function_name);
然后就可以用函数指针来调用这个函数了,可以像func_ptr("good", "luck")
这样,也可以(*unc_ptr)("good", "luck")
这样调用,两者是等价的
有了函数指针,编程就更加灵活了,下面主要介绍一种这样的一种应用——把函数作为参数传入
考虑以下,如果我们想实现多种方式的数组排序方法,我们会定义两个函数,一个指明排序规则,一个进行具体操作。