以冒泡排序为例:
void sort(int *a, int size)
{
    int i, j;
    for (i = 0; i < size-1; i++)
    {
        for (j = 0; j < size - i - 1; j++)
        {
            if (a[j] > a[j+1])
            {
                int num = a[j];
                a[j] = a[j+1];
                a[j+1] = num;
            }
            
        }
        
    }
    
}
int main(){
    int arr[9] = {1,2,3,4,5,6,7,8,9};
    sort(arr, 9); // sort
    for (int i = 0; i < 9; i++)
    {
        printf("%d ", arr[i]);
    }
    
    return 0;
}
结果

 但冒泡排序只能实现从小到大排序,如果想实现从大到小排序,难道就要重写sort函数了吗
可以用函数指针 作为回调函数传入,避免修改函数的麻烦
 定义以下函数
int greater(int a, int b)
{
    return a < b ? 1 : 0;
}
int less(int a, int b)
{
    return a > b ? 1 : 0;
}
void sort2(int *a, int size, int (*p)(int,int))
{
    int i, j;
    for (i = 0; i < size-1; i++)
    {
        for (j = 0; j < size - i - 1; j++)
        {
            if (p(a[j], a[j+1]))
            {
                int num = a[j];
                a[j] = a[j+1];
                a[j+1] = num;
            }
            
        }
        
    }
    
}
sort2中添加了函数指针 int (*p)(int,int), 且函数比较由
a[j] > a[j+1]
变为了
(p(a[j], a[j+1])
此时,main函数为
int main(){
    int arr[9] = {1,2,3,4,5,6,7,8,9};
    //sort(arr, 9); // sort
    sort2(arr, 9, greater);
    for (int i = 0; i < 9; i++)
    {
        printf("%d ", arr[i]);
    }
    printf("\r\n");
    sort2(arr, 9, less);
    for (int i = 0; i < 9; i++)
    {
        printf("%d ", arr[i]);
    }
    return 0;
}
结果:
 
 没有修改sort函数 就实现了冒泡排序的逆序
一个看复杂指针的技巧:
例如
int *(*(*fp)(int))[10];
右左法则
 先向右分析 再向左分析
找到变量名fp 向右看 是个右括号,向左看,是个*号,说明fp是个指针。再分析fp指向什么。
c 语言中,括号除了表示优先级,还可以作位函数调用运算符。所以fp是个指针,指向函数。函数需要分析参数和返回值类型。
 fp右侧是个函数,函数的参数只有一个,类型为int。
(int)
再向左看 函数的返回值是
(*
是个指针
这个指针指向什么? 继续先向右看 指向了一个数组
[10]
再看左边 剩下了 int*
 表示数组中每个元素都是整型指针



















