美文网首页
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