指向函數指針數組的指針

轉移表

#include <stdio.h>
int Add(int x, int y)
{
    return x + y;
}
int Sub(int x, int y)
{
    return x - y;
}
int Mul(int x, int y)
{
    return x * y;
}
int Div(int x, int y)
{
    return x / y;
}
void menu()
{
    printf("************************************\n");
    printf("****  1.ADD              2.SUB  ****\n");
    printf("****  3.MUL              4.DIV  ****\n");
    printf("**************0.EXIT****************\n");
}
int main()
{
    int input = 0;
    int x = 0;
    int y = 0;
    int(*pfArr[5])(int, int) = { 0,Add,Sub,Mul,Div };
    do
    {
        menu();
        printf("請選擇:>");
        scanf("%d", &input);
        if (input > 0 && input < 5)
        {
            printf("請輸入一組數字:> ");
            scanf("%d%d", &x, &y);
            printf("%d\n", (*pfArr[input])(x, y));
        }
        else if (input == 0)
        {
            printf("計算器退出\n");
        }
        else
        {
            printf("非法輸入,請從新輸入\n");
        }

    } while (input);
    return 0;
}

這是函數指針的一個應用,確實是能夠在某些狀況下方便使用數組




指向函數指針數組的指針

#include <stdio.h>
int main()
{
    int arr[10] = { 0 };
    int(*p)[10]=&arr;//取出了數組的地址

    int (*pfArr)(int, int);//函數指針
    int (*pfArr[4])(int, int);//定義一個數組 - 函數指針數組

    int (*(*ppfArr)[4])(int, int) = &pfArr;
    //ppfArr是一個指向[函數指針數組]的指針
    //ppfArr是一個指針,指向一個數組,數組裏有四個元素
    //指向的數組裏每個元素的類型都是一個函數指針,int(*)(int,int)
    return 0;
}

函數有對應的地址,多個函數就能對應多個函數指針,同種類型的元素集合在一塊兒就成了數組,因而又有了指向函數指針數組的指針,而後多個指向函數數組的指針在一塊兒就能有指向函數指針數組的指針的數組,而後就又能有指向函數指針數組的指針的數組的指針...ide




回調函數 - qsort的使用

//經過一個函數指針調用的函數
//void* 能夠存儲任意類型的指針
//void*不能進行解引用操做
//void*不能進行加減整數的操做
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int cmp_int(const void* e1, const void* e2)
{
    return *(int*)e1 - *(int*)e2;
}
void test1()
{
    int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    qsort(arr, sz, sizeof(arr[0]), cmp_int);
    int i = 0;
    for (i = 0; i < sz; i++)
    {
        printf("%d ", arr[i]);
    }
}
int com_f(const void* e1, const void* e2)
{
    return *(float*)e1 - *(float*)e2;
}
void test2()
{
    float arr[] = { 1.2,2.1,3.5,3.5,4.8,8.9,7.8,5.6,6.5 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    qsort(arr, sz, sizeof(arr[0]), com_f);
    int i = 0;
    for (i = 0; i < sz; i++)
    {
        printf("%f ", arr[i]);
    }
}
struct Stu
{
    char name[20];
    int age;
};
int com_stu_by_age(const void* e1, const void* e2)
{
    return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}
int com_stu_by_name(const void* e1, const void* e2)
{
    return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}
void test3()
{
    struct Stu s[3] = { {"zhangsan",60},{"lisi",40},{"wangwu",50} };
    int sz = sizeof(s) / sizeof s[0];
    //qsort(s, sz, sizeof(s[0]), com_stu_by_age);
    //int i = 0;
    //for (i = 0; i < sz; i++)
    //{
    //  printf("%d ", *(&s[i].age));
    //}
    printf("\n");
    qsort(s, sz, sizeof(s[0]), com_stu_by_name);
    int j = 0;
    for (j = 0; j < sz; j++)
    {
        printf("%s ", &s[j].name);
    }
}
int main()
{
    //test1();
    //printf("\n");
    //test2();
    //printf("\n");
    test3();

    return 0;
}



qsort的演示程序

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

int compare_ints(const void* a, const void* b)
{
    int arg1 = *(const int*)a;
    int arg2 = *(const int*)b;

    if (arg1 < arg2) return -1;
    if (arg1 > arg2) return 1;
    return 0;

    // return (arg1 > arg2) - (arg1 < arg2); // 可行的簡寫
    // return arg1 - arg2; // 錯誤的簡寫(若給出 INT_MIN 則會失敗)
}

int main(void)
{
    int ints[] = { -2, 99, 0, -743, 2, INT_MIN, 4 };
    int size = sizeof ints / sizeof * ints;

    qsort(ints, size, sizeof(int), compare_ints);

    for (int i = 0; i < size; i++) 
    {
        printf("%d ", ints[i]);
    }

    printf("\n");
}
相關文章
相關標籤/搜索