编程新手求助:无法理解C语言函数指针的声明、赋值与调用
C语言函数指针详解:从声明到调用
嘿,作为编程新手,刚接触函数指针确实容易懵——毕竟它的语法看起来比普通变量指针复杂多了!我来一步步给你拆解这段代码里的核心点,帮你搞明白到底是怎么回事。
先搞懂:函数指针是什么?
普通指针(比如int *p)是用来存储变量的内存地址的,而函数指针,顾名思义,是用来存储函数的内存地址的。程序运行时,函数也会被加载到内存里,所以它也有自己的地址,函数指针就是用来指向这个地址的。
拆解关键声明:void (*fun_ptr)(int) = &fun;
我们把这行拆成两部分来看:声明部分和赋值部分。
1. 函数指针的声明:void (*fun_ptr)(int)
这个声明的语法看起来有点反人类,我们拆解成几个步骤:
- 首先,
(*fun_ptr)说明fun_ptr是一个指针(就像int *p里的*p表示p是指针); - 然后后面的
(int)说明,这个指针指向的是一个需要接收1个int类型参数的函数; - 最前面的
void说明,这个指针指向的函数返回值是void类型。
简单说:fun_ptr是一个指针,它专门用来指向「接收int参数、返回void」的函数。
2. 赋值部分:= &fun
这里的fun是你定义的函数名,在C语言里,函数名本身就代表这个函数的内存地址——所以&fun和fun是完全等价的!也就是说,这行代码也可以写成:
void (*fun_ptr)(int) = fun;
就像你给普通指针赋值时,int *p = &a;的逻辑类似,函数名本身就是它的内存地址标识。
拆解调用:(*fun_ptr)(10);
既然fun_ptr是指向函数fun的指针,那(*fun_ptr)就是对这个指针的解引用——解引用后就得到了它指向的函数fun本身,所以(*fun_ptr)(10)就和直接写fun(10)是完全一样的效果。
而且C语言还提供了简化写法,你甚至可以直接写成:
fun_ptr(10);
编译器会自动帮你处理函数指针的解引用操作,结果和上面的写法完全相同。
对比普通变量和函数指针
你提到普通变量是int a;声明、a=10;赋值,我们来做个类比:
- 普通变量:
int a;→ 声明一个存储int类型值的变量;a=10;→ 把数值10放到这个变量里。 - 函数指针:
void (*fun_ptr)(int);→ 声明一个存储「特定类型函数地址」的指针;fun_ptr = &fun;→ 把函数fun的地址放到这个指针里。
整个代码的运行流程
再把整个代码串一遍,帮你理清逻辑:
- 首先定义了一个普通函数
fun,它接收一个int参数,执行时打印这个参数的值; - 在
main函数里,我们声明并初始化了函数指针fun_ptr,让它指向fun函数; - 最后通过函数指针
fun_ptr调用了fun函数,传入参数10,程序输出Value of a is 10。
内容的提问来源于stack exchange,提问作者user14528515




