函数指针和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类型

``

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值