DAY8

发布时间 2023-07-30 10:58:14作者: Ninnne

函数指针使用案例(回调函数)

  1. 代码:

#include <stdio.h>
void A(){
    printf("Hello");
} 
void B(void (*ptr)())//B函数有一个函数指针作为它的参数 
{                   //ptr指向一个函数,这个函数应该是不带参数的而且返回void,就像A那样 
    ptr();//使用函数指针ptr调用它所指向的函数 
}
int main(){
    void (*p)() = A;//把p初始化为A的地址 
    B(p);//d调用B,向它传入指针p 
}

输出结果:

Hello
  1. 写成这样同样可以,因为函数的名字返回的就是指针(函数名就是地址)

int main(){
    B(A);
}

一个函数的引用传给另一个函数的时候,那个函数就被称作回调函数,所以,A在这里就是一个回调函数。函数B可以通过函数指针来回调它

  1. 想以升序排列数组

#include <stdio.h>
void BubbleSort(int *A,int n){
    int i,j,temp;
    for(i=0;i<n;i++){
        for(j=0;j<n-1;j++){
            if(A[j] > A[j+1]){
                temp = A[j];
                A[j] = A[j+1];
                A[j+1] = temp;
            }
        }
    } 
} //用了冒泡法 ,在冒泡排序中进行多轮比较 
int main(){
    int i;
    int A[] = {3,2,1,5,6,4};
    BubbleSort(A,6);
    for(i=0;i<6;i++){
        printf("%d ",A[i]);
    }
}

输出结果:

1 2 3 4 5 6
  1. 想用降序排列:只用把大于改成小于

    if(A[j] < A[j+1]){
                temp = A[j];
                A[j] = A[j+1];
                A[j+1] = temp;
            }
  1. 我们可以多传一个参数给排列函数,告诉它我想要升序还是降序,我们可以有一个标志,比如标志是1的时候我们升序排列,为0时降序,这样可以避免很多冗余的代码

#include <stdio.h>
int compare(int a,int b){
    if(a > b){
        return 1;
    }else return -1;
}
void BubbleSort(int *A,int n,int (*compare)(int,int)){
    int i,j,temp;
    for(i=0;i<n;i++){
        for(j=0;j<n-1;j++){
            if(compare(A[j],A[j+1]) > 0){
                temp = A[j];
                A[j] = A[j+1];
                A[j+1] = temp;
            }
        }
    } 
} //用了冒泡法 ,在冒泡排序中进行多轮比较 
int main(){
    int i;
    int A[] = {3,2,1,5,6,4};
    BubbleSort(A,6,compare);
    for(i=0;i<6;i++){
        printf("%d ",A[i]);
    }
}

输出结果:

1 2 3 4 5 6
  1. 降序排列

int compare(int a,int b){
    if(a > b){
        return -1;
    }else return 1;
}
  1. 按照绝对值大小排序

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int absolute_compare(int a,int b){
    if(abs(a) > abs(b)){
        return 1;
    }else return -1;
}
void BubbleSort(int *A,int n,int (*compare)(int,int)){
    int i,j,temp;
    for(i=0;i<n;i++){
        for(j=0;j<n-1;j++){
            if(compare(A[j],A[j+1]) > 0){
                temp = A[j];
                A[j] = A[j+1];
                A[j+1] = temp;
            }
        }
    } 
} //用了冒泡法 ,在冒泡排序中进行多轮比较 
int main(){
    int i;
    int A[] = {-3,2,1,-5,6,4};
    BubbleSort(A,6,absolute_compare);
    for(i=0;i<6;i++){
        printf("%d ",A[i]);
    }
}

输出结果:

1 2 -3 4 -5 6
  1. 这样做的目的是可以实现多种要求的排序,比如按绝对值大小排序

#include <math.h>
#include <stdlib.h>
int compare(const void* a, const void* b){//比较函数 
    int A = *((int*)a); //把它转换成整型指针 然后用*来解引用 
    int B = *((int*)b);
    return abs(A) - abs(B);
}
int main(){
    int i;
    int A[] = {-3,2,1,-5,6,4};
    qsort(A,6,sizeof(int),compare); 
    for(i=0;i<6;i++){
        printf("%d ",A[i]);
    } 
}
​

输出结果:

1 2 -3 4 -5 6

在比较函数中,待比较的元素是通过引用来传的,他们的地址通过指针来传