标题程序运行期间,每个函数都会占用一段连续的内存空间。而函数名就是该函数所占内存区域的起始地址 (也称“ 入口地址 ” )。
我们可以将函数的入口地址赋给一个指针变量 ,使该指针变量指向该函数。然后通过指针变量就可以调用这个函数。这种指向函数的指针变量称为“函数指针”。
-
定义形式
类型名 (* 指针变量名)(参数类型1, 参数类型2,…);
例如:int (*pf)(int ,char);
-
使用方法
用一个原型匹配的函数的名字给一个函数指针赋值。
通过函数指针可以调用它所指向的函数,写法为:函数指针名(实参表);
-
举例 1:
#include<iostream>
#include<cstring>
using namespace std;
void PrintMin(int a, int b) {
if (a < b)
printf("%d", a);
else
printf("%d", b);
}
int main() {
void(*pf)(int, int);
int x = 4, y = 5;
pf = PrintMin;
pf(x, y);
return 0;
}
- 举例 2:
类似 qsort库函数:void qsort (void *base, int nelem, unsigned int width,int ( * pfCompare)( const void *, const void *));
在调用函数时,用实参给调用的函数的形参中定义的函数指针赋值,之后在函数中直接用函数指针分别调用不同的判定标准函数,实现程序的简洁化。
#include <iostream>
using namespace std;
void * MyMax(void *a, int width, int n, int(*pfCompare)(void * n1, void * n2)) {
char* result = (char*)a;
for (int i = 1; i < n; ++i) {
if (pfCompare(result, (char*)a + i * width) < 0)
result = (char*)a + i * width;
}
return result;
}
int Compare1(void * n1,void * n2)
{
int * p1 = (int * )n1;
int * p2 = (int * )n2;
return ((*p1)%10) - ((*p2)%10);
}
int Compare2(void * n1,void * n2)
{
int * p1 = (int * )n1;
int * p2 = (int * )n2;
return *p1 - *p2;
}
#define eps 1e-6
int Compare3(void * n1,void * n2)
{
float * p1 = (float * )n1;
float * p2 = (float * )n2;
if( * p1 - * p2 > eps)
return 1;
else if(* p2 - * p1 > eps)
return -1;
else
return 0;
}
int main()
{
int t;
int a[10];
float d[10];
cin >> t;
while(t--) {
int n;
cin >> n;
for(int i = 0;i < n; ++i)
cin >> a[i];
for(int i = 0;i < n; ++i)
cin >> d[i];
int * p = (int *) MyMax(a,sizeof(int),n,Compare1);
cout << * p << endl;
p = (int *) MyMax(a,sizeof(int),n,Compare2);
cout << * p << endl;
float * pd = (float * )MyMax(d,sizeof(float),n,Compare3);
cout << * pd << endl;
}
return 0;
}
来源:CSDN
作者:Cabbage_W
链接:https://blog.csdn.net/Cabbage_W/article/details/104619808