C语言函数指针详解
Posted 我系真滴菜
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言函数指针详解相关的知识,希望对你有一定的参考价值。
1、概念
函数指针就是一个指针,指针指向某个内存区域,函数指针就是指向函数入口地址的这么一个指针变量,在.c文件中编写一个函数,将.c编译为可执行程序后,在.c文件中编写的函数会存放在可执行程序的代码段中,入口地址就在这,先贴代码,再慢慢分析:
#include <stdio.h>
int val = 1;
void Test(int a)
printf("In Test a = %d\\n", a);
void Test111(int a)
printf("In Test111 a = %d\\n", a);
void Formal(void(*p)(int))
printf("In Formal Call:\\n");
(*p)(10);
void Formal111(void(**pp)(int))
printf("In Formal111 Change p\\n");
(*pp) = Test111;
(**pp)(10);
int main()
int step;
// 函数指针声明
void(*p)(int);
// 函数指针赋值
p = Test;
printf("Input 1 to Dsp Addr\\n");
printf("Input 2 to Dsp Call\\n");
printf("Input 3 to Dsp Formal parameter1\\n");
printf("Input 4 to Dsp Formal parameter2\\n");
while(1)
scanf("%d", &step);
printf("****************************\\n");
if(step == 1) // 地址展示
printf("Test = %p\\n", Test);
printf("p = %p\\n", p);
printf("&val = %p\\n", &val);
else if(step == 2) // 调用展示
(*p)(10);
else if(step == 3) // 形参展示1
Formal(p);
else if(step == 4) // 形参展示2
Formal111(&p);
else
printf("Input Num Must From 1 To 4\\n");
printf("****************************\\n");
return 0;
2. 代码分析
2.1 准备
保存上面的代码,命令为a.c,执行编译命令:gcc a.c -o test
2.2 入口地址分析
为了方便理解,我们定义了一个初始化的全局变量 val ,当定义指向该变量指针的时候就是指向其地址,初始化的全局变量存在于数据段,执行objdump -j .data -S test反编译程序数据段可以查看val的存放地址:
同理,我们定义的函数指针指向Test函数的入口地址,该函数存放在代码段,执行命令objdump -j .text -S test 进行反编译查看:
接下来将程序跑起来,输入数字1可以查看地址:
2.3 函数指针声明调用
了解了函数指针的本质后,来看下函数指针的声明,声明就是按样式来:
函数返回值类型(*指针变量名称)(函数参数列表)
示例中Test函数返回值为void参数入参为一个int类型数据,因此声明即为:void (*p)(int)
调用函数就是把(*p)这个当做函数名称Test来使用即可,输入数字2查看调用:
2.4 函数指针作为形参
函数指针作为形参时,就是把你声明的那一堆东西扔进形参列表里就行了, 像示例中void Formal(void(*p)(int))这样即可,输入数字3查看该函数执行:
2.5 函数指针的指针
多说一下函数指针的指针,和指针的指针一样,可以改变指针本身,输入数字4改变函数指针指向,再输入数字2可以查看指针指向已经改变了
以上是关于C语言函数指针详解的主要内容,如果未能解决你的问题,请参考以下文章