美文网首页
typedef关键字(二)

typedef关键字(二)

作者: lxr_ | 来源:发表于2021-10-22 12:57 被阅读0次
    //可以使用typedef简化一些比较复杂的类型声明,也相当于起别名
    
    #include <stdio.h>
    
    //*************简化数组指针声明***************
    typedef int(*PTR_TO_ARRAY)[3];  //PTR_TO_ARRAY为一个数组指针,指向有三个元素的int型数组
    
    //*************简化函数指针声明************
    typedef int(*PTR_TO_FUNC)(void);//PTR_TO_FUNC为一个函数指针,指向参数为void,返回类型为int的函数
    int func(void)
    {
        return 1;
    }
    typedef int* (*PTR_TO_FUNC_)(void);//PTR_TO_FUNC_为一个函数指针,指向参数为void,返回类型为int*的函数
    int i=1, j=2, k=3;
    int* funcA()
    {
        printf("i=%d", i);
        return &i;       //注意,不要返回局部变量的地址
    }
    int* funcB()
    {
        printf("j=%d", j);
        return &j;
    }
    int* funcC()
    {
        printf("k=%d", k);
        return &k;
    }
    
    //****************一种变态声明:*************************
    //void (*funA(int,void (*funB)(int)))(int);      
    //void (*funB)(int)为函数指针,该指针指向的函数参数为(int),返回值为void是最外面函数的一个参数,
    //故可简化为void (*funA(参数)) (int),括号内返回一个指针,故总体也是一个函数指针,即函数指针作为一种参数
    //总体的函数指针指向的函数参数为(int),返回值类型为void
    //typedef void(*PTR_TO_FUN)(int);      //PTR_TO_FUN为一个函数指针类型,指向的函数参数为(int),返回类型为void
    //PTR_TO_FUN fun(int, PTR_TO_FUN);     //上面的变态声明可简化
    
    //*******************举例:计算表达式(+ 或 —)************
    typedef int(*ptr_to_func)(int, int);
    int add(int num1, int num2)
    {
        return num1 + num2;
    }
    int sub(int num1, int num2)
    {
        return num1 - num2;
    }
    //函数指针作为参数
    //int calc(int(*fp)(int, int), int num1, int num2)   //原来的写法
    //{
    //  return (*fp)(num1, num2);
    //}
    //使用typedef定义的别名简写
    int calc(ptr_to_func fp, int num1, int num2)   //ptr_to_func为一个函数指针,指向的函数参数为(int,int),返回类型为int
    {
        return (*fp)(num1, num2);
    }
    
    //函数指针作为返回值
    //int(*select(char op))(int, int)   //先select(char)是一个函数,再加*表示这个函数返回一个函数指针,该指针指向的函数返回整形并带有两个参数(int,int)
    //{
    //  switch (op)
    //  {
    //  case '+':return add;
    //  case '-':return sub;
    //  default:
    //      break;
    //  }
    //}
    //使用typedef定义的别名简写:
    ptr_to_func select(char op)   //返回类型为ptr_to_func函数指针,该函数指针指向的函数参数为(int,int),返回类型为int
    {
        switch (op)
        {
        case '+':return add;
        case '-':return sub;
        default:
            break;
        }
    }
    //可以看出发现函数calc的参数函数指针int(*fp) (int,int)是select函数的返回类型,即使用typedef定义的ptr_to_func类型
    //******************举例END******************************
                                 
    int main(int argc, char** argv)
    {
        //***************简化数组指针*************
        int a[3] = { 1,2,3 };
        PTR_TO_ARRAY ptr_to_a = &a;
        for (int i = 0; i < 3; i++)
        {
            printf("%d\n", *(*ptr_to_a + i)); //输出数组的值
            //1        输出正确
            //2
            //3
        }
    
        //**************简化函数指针****************
        PTR_TO_FUNC ptr_to_func = &func;
        printf("%d\n", (*ptr_to_func)());     //1         使用函数指针调用函数
    
        PTR_TO_FUNC_ array[3] = { &funcA,&funcB,&funcC };            //定义有三个变量的数组,数组中的元素为函数指针
        for (int m = 0; m < 3; m++)
        {
            printf(" addr of num :%p\n", (*array[m])());             //同过指针数组中的函数指针调用对应的函数
            //i=1 addr of num :00C08034
            //j = 2 addr of num : 00C08038
            //k = 3 addr of num : 00C0803C
        }
    
        //************举例计算表达式(+ 或 -)**************
        int num1, num2;
        char op;
        int(*fpp)(int, int);  //定义函数指针,该函数指针指向的函数参数为(int,int),返回类型为int
    
        printf("请输入一个式子(如1+3):");
        scanf("%d%c%d", &num1, &op, &num2); //visual studio使用scanf时报错的话可采取如下解决办法:https://jingyan.baidu.com/article/49711c616b8a1ffa441b7cdc.html
    
        fpp = select(op);     //select函数的返回值类型为函数指针
        printf("%d %c %d = %d\n", num1, op, num2, calc(fpp, num1, num2));
    
        system("pause");
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:typedef关键字(二)

          本文链接:https://www.haomeiwen.com/subject/klwcaltx.html