(持续更新中!!~)13、原来可以这样理解C语言_理解指针(4/6)函数指针变量

目录

 4. 函数指针变量

4.1 函数指针变量的创建

4.2 函数指针变量的使⽤

4.3 两段有趣的代码

4.3.1 typedef 关键字


 4. 函数指针变量

4.1 函数指针变量的创建

        什么是函数指针变量呢?

         根据前⾯学习整型指针,数组指针的时候,我们的类⽐关系,我们不难得出结论:

         函数指针变量应该是⽤来存放函数地址的,未来通过地址能够调⽤函数的。

         那么函数是否有地址呢? 我们做个测试:

#include <stdio.h>

void test()
{
 printf("hehe\n");
}

int main()
{
 printf("test: %p\n", test);
 printf("&test: %p\n", &test);
 return 0;
}

        输出结果如下:

test: 005913CA
&test: 005913CA

        确实打印出来了地址,所以函数是有地址的,函数名就是函数的地址,当然也可以通过 &函数名 的⽅ 式获得函数的地址。

        如果我们要将函数的地址存放起来,就得创建函数指针变量咯,函数指针变量的写法其实和数组指针 ⾮常类似。如下:

void test()
{
 printf("hehe\n");
}

void (*pf1)() = &test;

void (*pf2)()= test;

int Add(int x, int y)
{
 return x+y;
}

int(*pf3)(int, int) = Add;

int(*pf3)(int x, int y) = &Add;//x和y写上或者省略都是可以的 

函数指针类型解析:

d3bdb98f6125486da09cc29545b37a2a.png

4.2 函数指针变量的使⽤

通过函数指针调⽤指针指向的函数。

#include <stdio.h>

int Add(int x, int y)
{
 return x+y;
}

int main()
{
 int(*pf3)(int, int) = Add;
 
 printf("%d\n", (*pf3)(2, 3));
 printf("%d\n", pf3(3, 5));
 return 0;
}

输出结果:

5

8

4.3 两段有趣的代码

(*(void (*)())0)();


void (*signal(int , void(*)(int)))(int);

4.3.1 typedef 关键字

        typedef是⽤来类型重命名的,可以将复杂的类型,简单化。

        ⽐如,你觉得 unsigned int 写起来不⽅便,如果能写成 uint 就⽅便多了,那么我们可以使⽤:

typedef unsigned int uint;

//将unsigned int 重命名为uint 

        如果是指针类型,能否重命名呢?其实也是可以的,⽐如,将 int* 重命名为 ptr_t ,这样写:

typedef int* ptr_t;

        但是对于数组指针和函数指针稍微有点区别:

        ⽐如我们有数组指针类型 int(*)[5] ,需要重命名为 parr_t ,那可以这样写:

typedef int(*parr_t)[5]; //新的类型名必须在*的右边 

        函数指针类型的重命名也是⼀样的,⽐如,将 void(*)(int) 类型重命名为 pf_t ,就可以这样写:

typedef void(*pfun_t)(int);//新的类型名必须在*的右边 

        那么要简化代码2,可以这样写:

typedef void(*pfun_t)(int);

pfun_t signal(int, pfun_t);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值