函数指针

馋奶兔 提交于 2020-03-03 07:24:43
标题程序运行期间,每个函数都会占用一段连续的内存空间。而函数名就是该函数所占内存区域的起始地址 (也称“ 入口地址 ” )。

我们可以将函数的入口地址赋给一个指针变量 ,使该指针变量指向该函数。然后通过指针变量就可以调用这个函数。这种指向函数的指针变量称为“函数指针”。

  • 定义形式
    类型名 (* 指针变量名)(参数类型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;
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!