冒泡排序与函数指针.


何为函数指针? 

即 void (*pf)();

如上声明,即为最简单的函数指针声明.无返回值,无参数.

在学习c语言构建一个ADT的时候,看到过函数的指针,但是没有真切感受到其作用.

感觉在大多数时候它是没什么作用的,因为仔细一想,把函数作为参数,也就是在一个函数里

调用另外一个函数,那我何必多次一举,直接调用想用的函数就完了呗.

但是,今天是感受到其作用了,那是用在冒泡排序上,作用便是随意指挥冒泡排序,

即让其进行升序排列,还是降序排列.

在之前我写过一篇关于冒泡排序的优化版,今天的这一版和函数指针相结合,可以说是很棒棒了

以下为代码

#include
int bigger(int , int );
int smaller(int , int );
void BubbleSort(char *, int , int (*fp)(int , int));
int main()
{
	int i;
	char st[10] = {10,9,8,7,6,5,4,3,2,1};
	BubbleSort(st,10,smaller);
	for(i = 0; i < 10; i++)
	{
		printf("%d ",st[i]);
	}
	printf("\n");
	return 0;
}

void BubbleSort(char *st, int length, int(*fp)(int , int))
{
	int i;
	int j;
	int temp;
	int flag = 1;
	for(i = 0; i < length-1; i++)
	{
		for(j = 0; j < length- i-1; j++)
		{
			if ((*fp)(st[j], st[j+1]))
			{
				temp = st[j];
				st[j] = st[j+1];
				st[j+1] = temp;
				flag = 0;
			}
			if (i == 0&& j == length-2-i  && flag==1)  
			{  
             			printf("Your array has been sort yet!\n");  
             			printf("It doesn's need to sort!\n");  
            		}  
		}

	}
}
int bigger(int a, int b)
{
	return a > b;
}
int smaller(int a, int b)
{
	return a

以上代码的重点在于for嵌套循环内的if替换判断和bigger和smaller函数.

还有一点就是 因为函数的地址即使函数本身,

所以还有其他使用函数指针方法,就是直接使用函数指针变量名 

fp() == (*fp)(); 他们两个是等价的.

但是有时候为了增强代码的可读性,建议统一使用(*fp)()形式, 能很清晰的看出来调用的是函数指针指向的这个函数.


你可能感兴趣的:(C语言)