[其它应用] 函数指针的用法

[复制链接]
 楼主| duo点 发表于 2024-11-22 10:28 | 显示全部楼层 |阅读模式
在程序运行中,函数代码是程序的算法指令部分,它们和数组一样也占用存储空间,都有相应的地址。可以使用指针变量指向数组的首地址来调用数组数据,也可以使用指针变量指向函数代码的首地址来调用函数,指向函数代码首地址的指针变量就称为函数指针。

1.函数指针定义

函数类型 (*指针变量名)(形参列表);

“函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少,后面的“形参列表”表示指针变量指向的函数所带的参数列表。

例如:

int (*f)(int x);

double (*ptr)(double x);

在定义函数指针时请注意:
   
函数指针和它指向的函数的参数个数和类型都应该是—致的;

函数指针的类型和函数的返回值类型也必须是一致的。

2.函数指针的赋值

函数名和数组名一样代表了函数代码的首地址,因此在赋值时,直接将函数指针指向函数名就行了。

例如,

int func(int x);   /* 声明一个函数 */

int (*f) (int x);    /* 声明一个函数指针 */

把函数的地址赋值给函数指针,可以采用下面两种形式:
      
f=&func;            /* 将func函数的首地址赋给指针f */   
f=func;

赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。
第二种格式看上去和函数调用无异。但是有些程序员倾向于使用第一种格式,因为它明确指出是通过指针而非函数名来调用函数的。

3、下面给出一个示例程序:


#include
void (*fp)(); //函数指针: 指向函数的指针包含了函数的地址,可以通过它来调用函数

void (*fp_para)(char *);//带参数的函数指针


void func_para(char *s);
void func();

int main(void)
{
    fp_para=&func_para;//或者:fp_para=func_para;

    (*fp_para)("This is the parameter of the funtion!");

    fp=&func;//或者:fp=&func;

    (*fp)();

    return 0;
}

void func_para(char *s)
{
    printf("%s\n", s);
}

void func()
{
    printf("This function has no parameter!\n");
}
Undshing 发表于 2024-11-24 16:13 | 显示全部楼层
可不可以直接指定一个地址,然后把函数程序拷贝到这个地址实现更改这个地方来实现不同的函数
Wxy8030 发表于 2024-11-24 18:52 来自手机 | 显示全部楼层
学习一下
szt1993 发表于 2024-11-24 21:50 | 显示全部楼层
函数代码是程序的算法指令部分
LOVEEVER 发表于 2024-11-25 23:42 | 显示全部楼层
函数指针的类型和函数的返回值类型也必须是一致的。
中国龙芯CDX 发表于 2024-11-27 09:42 | 显示全部楼层
函数代码是程序的算法指令部分,它们和数组一样也占用存储空间,都有相应的地址。
小夏天的大西瓜 发表于 2024-11-27 23:51 | 显示全部楼层
指向函数代码首地址的指针变量就称为函数指针。
小小蚂蚁举千斤 发表于 2024-11-29 21:32 | 显示全部楼层
“函数类型”说明函数的返回类型
Henryko 发表于 2024-11-30 08:30 来自手机 | 显示全部楼层
如何指向函数地址啊
玫瑰凋零日记 发表于 2025-6-29 18:02 | 显示全部楼层
函数指针是指向函数的变量,用于动态调用函数。用法:
声明:返回类型 (*指针名)(参数类型列表),如int (*func)(int, int);
赋值:指向函数地址,如func = add;(add 为函数名)
调用:(*func)(实参)或func(实参),如result = (*func)(3, 4);
应用:回调函数(如 qsort 的比较函数)、函数表(简化多路分支)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

498

主题

2088

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部