c 语言的函数与函数指针

本文探讨了C语言中函数不是一等公民,无法像变量一样初始化和赋值。通过函数指针,可以实现对函数的赋值和调用。示例展示了如何声明、定义和使用函数指针,以及函数指针与普通变量的区别。同时,解释了通过函数指针调用函数的等价性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

备忘

  1. c语言的函数不是“一等公民”,它不算一种变量类型,不能像变量一样初始化、赋值。只能进行定义、声明、调用。
#include <stdio.h>

int main() {
    void (func)(int); 							// declaration

    // void (func2)(int) = func; 				// error: illegal initializer (only variables can be initialized)

    func(1); 									// success calling 1
}

// definition
void func(int a) {
    printf("success calling %d\n", a);
}
  1. c 语言提供了函数指针来完成类似于变量的操作。

函数指针是一种变量,可以正常地进行声明、定义、初始化、赋值、传参等操作。它与其它变量的不同之处在于它是 callable 的.

#include <stdio.h>

void func(int a) {
    printf("success calling %d\n", a);
}

int main() {
    void (*fp1)(int) = nullptr;

    // fp1(1);                  // interrupted by signal 11: SIGSEGV

    fp1 = &func;

    fp1(2);                     // success calling 2


    // long long i = 1;
    // i();                     // error: called object type 'int' is not a function or function pointer
    // ((void (*)())i)();       // interrupted by signal 11: SIGSEGV
}
  1. 虽然类型不同,但调用函数与调用函数指针是等价的,也可以直接将函数赋值给函数指针。
#include <stdio.h>

void func(int a) {
    printf("success calling %d\n", a);
}

int main() {
    func(1);

    void (*fp1)(int) = nullptr;

    fp1 = &func;
    (*fp1)(2);
    fp1(3);

    fp1 = func;
    (*fp1)(4);
    fp1(5);

    fp1 = *fp1;
    (*fp1)(6);
    fp1(7);

    (&func)(8);

    printf("%s\n", typeid(func).name());    // FviE
    printf("%s\n", typeid(fp1).name());     // PFviE
    printf("%s\n", typeid(*fp1).name());    // FviE
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值