何为函数指针?
即 void (*pf)();
如上声明,即为最简单的函数指针声明.无返回值,无参数.
在学习c语言构建一个ADT的时候,看到过函数的指针,但是没有真切感受到其作用.
感觉在大多数时候它是没什么作用的,因为仔细一想,把函数作为参数,也就是在一个函数里
调用另外一个函数,那我何必多次一举,直接调用想用的函数就完了呗.
但是,今天是感受到其作用了,那是用在冒泡排序上,作用便是随意指挥冒泡排序,
即让其进行升序排列,还是降序排列.
在之前我写过一篇关于冒泡排序的优化版,今天的这一版和函数指针相结合,可以说是很棒棒了
以下为代码
#include<stdio.h>
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<b;
}
以上代码的重点在于for嵌套循环内的if替换判断和bigger和smaller函数.
还有一点就是 因为函数的地址即使函数本身,
所以还有其他使用函数指针方法,就是直接使用函数指针变量名
fp() == (*fp)(); 他们两个是等价的.
但是有时候为了增强代码的可读性,建议统一使用(*fp)()形式, 能很清晰的看出来调用的是函数指针指向的这个函数.
1952

被折叠的 条评论
为什么被折叠?



