问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

函数指针三种定义与使用方式

创作时间:
作者:
@小白创作中心

函数指针三种定义与使用方式

引用
CSDN
1.
https://blog.csdn.net/weixin_45525272/article/details/118711459

函数指针是C语言中的一个重要概念,它允许我们将函数的入口地址存储在变量中,从而实现动态调用函数的功能。本文将详细介绍函数指针的三种定义方式,并通过具体的代码示例帮助读者理解其使用方法。

函数类型剖析

通过什么来区分两个不同的函数?

一个函数在编译时被分配一个入口地址,这个地址就称为函数的指针,函数名代表函数的入口地址。

函数三要素: 名称、参数、返回值。(C 语言中的函数有自己特定的类型)

c 语言中通过 typedef 为函数类型重命名:

// f 为函数类型
typedef int f(int, int); 

// p 为函数类型
typedef void p(int); 

这一点和数组一样,因此我们可以用一个指针变量来存放这个入口地址,然后通过该指针变量调用函数。

注意:通过函数类型定义的变量是不能够直接执行,因为没有函数体。只能
通过类型定义一个函数指针指向某一个具体函数,才能调用。

typedef void(p)(int, int);
void my_func(int a, int b)
{
    printf("%d %d\n", a, b);
}

void test()
{
    p p1;
    //p1(10,20); //错误,不能直接调用,只描述了函数类型,但是并没有定义函数体,没有函数体无法调用
    p* p2 = my_func;
    p2(10, 20); //正确,指向有函数体的函数入口地址
}

函数指针(指向函数的指针)

函数指针定义方式有三种:

  1. 先定义函数类型,通过类型定义指针
  2. 先定义函数指针类型,根据类型定义指针变量
  3. 直接定义函数指针变量

函数指针三种定义方式

假设我们有以下函数:

int my_func(int a, int b) {
    printf("ret:%d\n", a + b);
    return 0;
}

接下来,我们分别介绍三种定义函数指针的方式:

//1. 先定义函数类型,通过类型定义指针
void test01() {
    typedef int(FUNC_TYPE)(int, int);

    FUNC_TYPE* f = my_func;
    //如何调用?
    (*f)(10, 20);
    f(10, 20);
}
//2. 定义函数指针类型
void test02() {
    typedef int(*FUNC_POINTER)(int, int);
    FUNC_POINTER f = my_func;
    //如何调用?
    (*f)(10, 20);
    f(10, 20);
}
//3. 直接定义函数指针变量
void test03() {
    int(*f)(int, int) = my_func;
    //如何调用?
    (*f)(10, 20);
    f(10, 20);
}

函数指针和指针函数的区别

  • 函数指针是指向函数的指针;
  • 指针函数是返回类型为指针的函数;

代码案例

对于函数指针作为函数参数的使用方法,可以参考以下文章:

C语言提高:函数指针做函数参数

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号