函数指针

本文详细介绍了函数指针的概念,包括其定义、书写方式及实际应用案例,并对比了指针函数的区别。

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

函数指针


阅读目录:

1、函数指针的实质

2、函数指针的书写

3、函数指针使用实例

4、与指针函数分辨


1、函数指针的实质

(1)函数指针的实质还是指针,还是指针变量。本身占4字节(在32位系统中,所有的指针都是4字节),其与数组指针、普通指针之间并没有本质区别,仅是指针指向内容差异。

(2)函数的实质是一段代码,这一段代码在内存中是连续分布的(一个函数的大括号括起来的所有语句将来编译生成的可执行程序是连续的),所以对于函数来说很关键的就是函数中的第一句代码的地址,这个地址就是所谓的函数地址,在C语言中用函数名这个符号来表示。

(3)结合函数的实质,函数指针其实就是一个普通变量,这个普通变量的类型是函数指针变量类型,它的值就是某个函数的地址(也就是它的函数名这个符号在编译器中对应的值)


2、函数指针的书写

(1)C语言本身是强类型语言(每一个变量都有自己的变量类型),编译器会做严格的类型检查。

(2)假设我们有个函数是:void func(void); 对应的函数指针:void (p)(void); 类型是:void ()(void);

(3)函数名和数组名最大的区别就是:函数名做右值时加不加&效果和意义都是一样的;以int a[5]为例,数组名a做右值时, a代表首元素首地址,是(int*)类型的指针,&a是数组指针,其类型为int(*)[5].

(4)复杂的函数指针实例:譬如strcpy函数(char strcpy(char *dest, const char *src);),对应的函数指针是:char (*pFunc)(char *dest, const char *src);

简单来说,函数就是返回类型 函数名(输入参数), 使用*pFunc替代函数名即可


3、函数指针使用实例


#include <stdio.h>

int add(int a, int b);
int sub(int a, int b);
int multiply(int a, int b);
int divide(int a, int b);

// 定义了一个类型pFunc,这个函数指针类型指向一种特定参数列表和返回值的函数
typedef int (*pFunc)(int, int);

int main(void)
{
    pFunc p1 = NULL;
    char c = 0;
    int a = 0, b = 0, result = 0;

    printf("请输入要操作的2个整数:\n");
    scanf("%d %d", &a, &b);
    printf("请输入操作类型:+ | - | * | /\n");

    do 
    {
        scanf("%c", &c);
    }while (c == '\n');
    // 加一句调试
    //printf("a = %d, b = %d, c = %c.\n", a, b, c);

    switch (c)
    {
        case '+':
            p1 = add; break;
        case '-':
            p1 = sub; break;
        case '*':
            p1 = multiply; break;
        case '/':
            p1 = divide; break;
        default:
            p1 = NULL;  break;
    }


    result = p1(a, b);
    printf("%d %c %d = %d.\n", a, c, b, result);

    return 0;
}


int add(int a, int b)
{
    return a + b;
}

int sub(int a, int b)
{
    return a - b;
}

int multiply(int a, int b)
{
    return a * b;
}

int divide(int a, int b)
{
    return a / b;
}

执行结果:
这里写图片描述

通过一个简易计算器,证实函数指针是指向函数的指针变量,输入参数后可以执行正常的四则运算


4、与指针函数的分辨

指针函数:函数有返回值,并且其返回类型指针变量

int* func(int a, int b)

分辨:

1) char * fun1(char * p1,char * p2);
2) char * *fun2(char * p1,char * p2);
3) char  (*fun3)(char * p1,char * p2);
4) char * (*fun4)(char * p1,char * p2);

1) fun1是函数名,p1,p2是参数,其类型为char 型,函数的返回值为char 类型。 指针函数

2) 与1)相比,唯一不同的就是函数的返回值类型为char**,是个二级指针。

3) 这里fun3不是函数名,而是一个指针变量,它指向一种函数。这种函数有两个指针类型的参数,函数的返回值是普通变量,函数指针

4) 这里fun4与func3一致,不是函数名,是一个指针变量,它指向一种函数。这种函数有两个指针类型的参数,函数的返回值是指针变量,这里兼有函数指针和指针函数


小结:

其实说函数指针、指针函数这些概念是容易引起混淆的,二者侧重点完全不同,放在一起咬文嚼字意义不大

函数无非就是四部分,返回类型 函数名(参数列表) 函数体,参数列表为输入,函数体加工,返回类型体现加工状态或结果,函数名告诉去哪里开始执行一段连续的代码。

一般看到表达式就一清二楚了

 int*  f(int a, int b);  //  指针函数,重点强调返回值类型是一个地址变量
 int (*f)(int a, int b);   // 函数指针,强调一种函数类型
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值