函数指针和typedef的使用

Posted dengqiangjiayou

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数指针和typedef的使用相关的知识,希望对你有一定的参考价值。

函数指针和typedef的使用

函数指针的作用是什么?我个人觉得是:函数指针可以实现同一个函数模板实现不同的功能。一个函数也可以在另一个函数的参数中存在也就是函数也可以作为形参。也可以在结构体中声明一个函数指针,这相当于你的结构体里面有一个函数,当然也可以直接在结构体里面定义函数(结构体和C++中的 class 唯一的不同就是成员的权限,struct默认权限是私有的,而class默认权限是公有的)

讲函数指针之前先来讲一下typedef的使用

众所周知,typedef 是重命名一个已经存在的类型,这句话太过于简练了。typedef 的使用如下:

typedef unsigned int u32; //(也就是在编译阶段把u32类型替换为 unsigned int类型)
//也就是 typedef [原有类型] [别名]  
typedef int (*Func)(int ,int ); //去掉typedef int (*Func)(int ,int ) Func定义出来的就是一个函数指针,该函数有2个int型的参数,返回值类型是int型
//typedef int (Fun)(int , int) //这个就纯粹定义一个函数
//使用如下
int add(int a, int b)

    return (a +b);

int Cal(int a,int b,char op,Func func) //这里你如果想用一个函数当另一个函数的参数的话就要这样定义形参

    switch(op)
    
        case '+':return func(a,b);
    
    default: return 0;


int main()

    char op = '+';
    printf("%d\\n",Cal(4,8,add));
    printf("%d\\n",Cal(4,8,&add)); //2者结果一样,

那问题来了,typedef int (*Func)(int , int) 和 typedef int (Func)(int , int) 有什么区别呢?

//来同样的代码
typedef int (Fun)(int , int)
int add(int a, int b)

    return (a +b);

int Cal(int a,int b,char op,Fun fun) //这里你如果想用一个函数当另一个函数的参数的话就要这样定义形参

    switch(op)
    
        case '+':return fun(a,b);
    
    default: return 0;


int main()

    char op = '+';
    printf("%d\\n",Cal(4,8,add));
    printf("%d\\n",Cal(4,8,&add)); //2者结果也一样,

所以2者有什么不同?从上面它们基本一样!

以上是我在VSC中执行的代码及结果,我使用在VSC的命令行下使用gcc -v查看gcc版本:

8.1.0版本

所以我决定用高低版本的gcc来试一下:PS:一下是在linux下的,gcc版本4.4.5

typedef int(*Func)(int ,int );
typedef int(Fun)(int , int);
int add(int a,int b)

    return (a + b );


int main()

    
    Func func = add;
    printf("%d\\n",func(1,4));
    //Fun fun = add;
   // printf("%d\\n",fun(1,4));
    return 0;


运行正常

typedef int(*Func)(int ,int );
typedef int(Fun)(int , int);
int add(int a,int b)

    return (a + b );


int main()

    
    Func func = add;
    printf("%d\\n",func(1,4));
    Fun fun = add;
    printf("%d\\n",fun(1,4));
    return 0;


错误出现在main函数里,fun像是一个变量,fun声明了但是没有定义

但是如果做一下改变:

typedef int(*Func)(int ,int );
typedef int(Fun)(int , int);
int add(int a,int b)

    return (a + b );


int main()

    
    Func func = add;
    printf("%d\\n",func(1,4));
    Fun* fun = add; //改了这里!
    printf("%d\\n",fun(1,4));
    return 0;


所以他们的区别,知道了吧?

额外补充一些 typedef 的使用:

//typedef int (*Func)(int , int);
//typedef int (Fun)(int , int);
typedef int* Fun(int , int) //这个和上面一个也是一样,不过其函数返回值是一个指针
typedef int array[5]; // array 是含5个元素的数组
array arr = 1, 2, 3, 4, 5;
arr[0] = 1;

typedef int (*array)[5]; //数组指针,数组里有5个元素,每个元素都是int型
typedef int* (array)[5]; //指针数组,数组里有5个元素,每个元素都是指针,指针指向的是int类型

``

以上是关于函数指针和typedef的使用的主要内容,如果未能解决你的问题,请参考以下文章

函数指针和typedef的使用

typedef 的使用

使用typedef给函数指针类型一个别名

结构体中函数指针与typedef关键用途(函数指针)

由typedef和函数指针引起的危机

了解 C 中函数指针的 typedef