C语言中函数名作为函数的形参

在之前阅读网上排序的代码时,当时有一段地方看不懂,就是一个排序函数,有三个参数列表,数组名,长度,还有一个"compare"
今天突然想到,排序过程中,是否进行交换(选择排序为例)是判断是否两个的大小关系,满足。
可是以往都是讲排序默认成,升序,或者降序,如果出现另外的条件(字符串大小,长度等等)又改怎么办,这就引入了sort第三个参数列表,compare,这是一个函数指针,指向实参传来的函数地址,函数指针作为形式参数。
对于他的理解,参考C语言的指针部分,就是在程序子块,函数被编译后,为它分配一段存储地址,他的函数名就和数组名差不多,代表一个地址。函数名的形参可以理解成指向函数的指针(指向函数的指针格式是 类型(*函数名)(参数列表)例如(*compare)(int ,int ))
**

#include<stdio.h>
int shengxu(int x,int y)
{
	if(x<=y)	return 0;
	else 	return 1;
}
int jiangxu(int x,int y)
{
	if(x>=y)	return 0;
	else 	return 1;
}
void sort(int *number,int N,int (*compare)(int ,int ))
{
	int i,k,j,t;
	for(i=0;i<N-1;i++)
	{
		for(j=i+1;j<N;j++)
		{
			if(compare(number[i],number[j]))
			{
				t=number[i];
				number[i]=number[j];
				number[j]=t;
			}
		}
	}
}
int main()
{
	int number[10];
	int i,N;
	scanf("%d",&N);
	for(i=0;i<N;i++)
	{
		scanf("%d",&number[i]);
	}
	sort(number,N,shengxu);
	for(i=0;i<N;i++)	printf(" %d",number[i]);
	printf("\n");
	sort(number,N,jiangxu);
	for(i=0;i<N;i++)	printf(" %d",number[i]);
}

**
结果就是一个升序,一个降序,引入的compare增加了sort函数的通用性,满足条件的进行改变,这个条件是否满足,就由sort中的实参函数决定

猜你喜欢

转载自blog.csdn.net/AXKDD6555/article/details/89792252