C 语言 函数指针

发布于 2024-07-27 00:42:32 字数 3115 浏览 24 评论 0

函数中传递函数名,函数名是指向函数的指针,当你创建 myfunc(int arg) 的函数也创建了 myfunc 的指针变量(this save address of function),当调用函数时,你在使用函数指针。

1. 没有函数类型

在 C 中没有函数类型,就不能用 function * 声明函数指针

int *a;         // 声明 int 指针
function *f;    // error

2. 如何创建函数指针

一个示例代码:

int (*warp_fn)(int);        // 创建 warp_fn 变量,保存 func1() 函数的地址
warp_fn = func1;
warp_fn(4);                 // 相当于调用 func1()

char** (*name_fn)(char *, int); //name_fn 变量保存函数地址
name_fn = func2;
char** results = name_fn("good", 19); 

这么复杂的原因:函数返回类型,参数类型要告诉编译器。

char** : 是一个指针,通常用来指向字符串数组。

2.1 通常的函数调用

void myfunc(int x); // 声明函数, 也可写成:void myfunc(int)

int main(int argc, char *argv[]) {
    myfunc(10);     // 函数调用
    return 0;
}

void myfunc(int x) {    // 函数定义
    printf("%i\n", x);
}

2.2 函数指针变量的声明与调用

函数的首地址也以存储在某个函数指针变量里的,就可以通过这个函数指针变量来调用所指向的函数了.

void (*funp)(int);  // 声明指向 myfunc 函数的函数指针变量 funp

也可写:

void (*funp)(int x);

关于调用形式,有好几种:

void myfunc(int x); // 声明函数, 也可写成:void myfunc(int)
void (*funp)(int);  // 声明指向 myfunc 函数的函数指针变量 funp

int main(int argc, char *argv[]) {
    myfunc(10);         // 函数调用, 10
    
    funp = &myfunc;    // 将 myfunc 地址赋值给 funp, 20
    funp(20);
    
    funp = myfunc;      // myfunc 赋值给 funp, 30
    funp(30);
    
    (*myfunc)(40);      // *myfunc 取值, 40
    
    (*funp)(50);        // *funp 取值, 50
    
    return 0;
}

void myfunc(int x) {    // 函数定义
    printf("%i\n", x);
}

通过这段代码我们可以得出以下结论:

  • 1)其实,MyFun 的函数名与 FunP 函数指针都是一样的,即都是函数指针。MyFun 函数名是一个函数指针常量,而 FunP 是一个函数数指针变量,这是它们的关系。
  • 2)但函数名调用如果都得如(*MyFun)(10) 这样,那书写与读起来都是不方便和不习惯的。所以 C 语言的设计者们才会设计成又可允许 MyFun(10) 这种形式地调用(这样方便多了并与数学中的函数形式一样,不是吗?)。
  • 3)为统一起见,FunP 函数指针变量也可以 FunP(10) 的形式来调用。
  • 4)赋值时,即可 FunP = &MyFun 形式,也可 FunP = MyFun。

2.3 定义函数指针类型

typedef void (*FunType)(int);   // 定义一个函数指针类型
FunType funp;                   // 用 FunType 类型声明全局变量 funp

void (*FunType)(int) 前加了一个 typedef 。这样只是定义一个名为 FunType 函数指针类型,而不是一个 FunType 变量。

void myfunc(int x);             // 声明函数, 也可写成:void myfunc(int)

typedef void (*FunType)(int);   // 定义一个函数指针类型
FunType funp;                   // 用 FunType 类型声明全局变量 funp

int main(int argc, char *argv[]) {
    funp = myfunc;      // funp = &myfunc;
    funp(100);
    return 0;
}

void myfunc(int x) {    // 函数定义
    printf("%i\n", x);
}

有了 FunType 类型后,我们就可以同样地、很方便地用 FunType 类型来声明多个同类型的函数指针变量了。如下:

FunType funp; 
FunType funp2;
...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

酒绊

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

金兰素衣

文章 0 评论 0

ゃ人海孤独症

文章 0 评论 0

一枫情书

文章 0 评论 0

清晰传感

文章 0 评论 0

mb_XvqQsWhl

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文