千家信息网

如何掌握C语言编程函数指针

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要讲解了"如何掌握C语言编程函数指针",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"如何掌握C语言编程函数指针"吧!目录一、指针引子二、使用步
千家信息网最后更新 2026年11月01日如何掌握C语言编程函数指针

这篇文章主要讲解了"如何掌握C语言编程函数指针",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"如何掌握C语言编程函数指针"吧!

目录
  • 一、指针引子

  • 二、使用步骤

    • 1.取函数地址

    • 2.创建函数指针

    • 3.通过函数指针调用函数的两种方法

  • 三、函数指针进阶

    一、指针引子

    示例:我们常常接触的指针大多有如下几类:
    整形指针-存放整形地址,指向整形
    字符指针-存放字符地址,指向字符
    数组指针-存放数组地址(注意不是数组首元素地址),指向数组

    由以上三个例子,我们能总结指针的共同点:存放某个类型变量的地址,指向那个类型的变量,但是在讲函数指针首先有一个问题:函数也有地址吗?我们用一段简单的代码来验证一下即可。

    #includeint Add(int x,int y){   return x+y;}int main(){   printf("%p\n",&Add);   return 0;}

    屏幕上打印出地址:

    所以答案是有的,函数也存在地址,那么也就衍生出了今天的知识点-函数指针。

    二、使用步骤

    1.取函数地址

    我们知道&数组名,取出的是数组的地址。单独一个数组名,取出的是数组首元素的地址。但是对于函数来说:函数名==&函数名

    我们代码验证一下(示例):

    #includeint Add(int x,int y){   return x+y;}int main(){   printf("%p\n",&Add);   printf("%p\n",Add);   return 0;}

    显然,打印出来的地址是一样的,但是这个时候也会有同学跳出来说:"那数组名和&数组名打印出来的地址还一样呢,但意义明显不一样啊"。但是你想想,函数也没有首元素等其他玩意啊,它就是它本身啊,它也不会出现什么函数首元素啊。

    所以再次声明:
    在函数指针这一块 函数名==&函数名,它的意义和值,都是一样的

    2.创建函数指针

    我们知道,数组指针用来存放数组地址,整形指针用来存放整形地址。。。函数指针也不例外,它用来存放函数地址,我们现在定义一个p来存放Add地址,那它的类型怎么创建?我们来看一下具体步骤:

    1.p是一个指针对吧,给它一个*是不是必须的 p变成了 * p。为了确保 * 和 p结合(如果没有括号,*或者p有可能会与其他的一些符号结合,具体参见符号优先级)那我在 * p外面加一个括号便于观看也没有问题吧,也就是(*p)

    2.那函数总得有参数啊,比如这里是Add(int x,int y)。参数x和y的类型是int
    你指针指向的函数是不是要找一下它的参数。所以(*p)(int,int)

    3.那函数还有一个性质啊,有没有返回值,要是有的话,类型呢? 这里以Add为例,它是返回int型,所以我们指针也返回int 型 即int(*p)(int,int)

    到这里Add函数指针的类型就创建完成啦即为*int(p)(int ,int)

    需要注意的是:不同函数的参数类型和返回值类型是不一样的,到时候需要根据不同函数对类型进行转换,这里只是以Add函数为例,其他函数以此类推

    ps:一个快速判别类型的方法--去掉变量的名字,剩下的就是类型
    代码如下(示例):

            int a = 10;//去掉a 类型int        int arr[10] = { 0 };//去掉arr 类型int [10]        int(*parr)[10] = &arr;//去掉parr 类型int(*)[10],数组指针,指向一个10int型元素的数组        int(*pf)(int, int) = &Add;//去掉pf 类型int(*)(int,int)

    3.通过函数指针调用函数的两种方法

    法一:
    我们平时在调用函数的时候,一般就是函数名( ,)然后把参数传进括号即可,那我们现在有函数指针了呀,指针怎么使用?p不是指向了函数Add嘛,我们用*解引用指针,得到的是地址里的东西,也就是说 *p==Add,用 * p(,)来传参也可以实现Add函数的调用。代码如下:

    #includeint Add(int x, int y){        return x + y;}int main(){        int ret = Add(2, 3);        printf("%d\n", ret);//ret=5        int(*p)(int, int) = &Add;//p是一个指向函数Add的指针        ret = (*p)(3, 3);//ret=6        //p指向Add,对p解引用就是Add        //简言之:*p=Add        //我们并不总是可以拿到变量,有时是拿到变量的地址        //对应函数指针同样的道理,有时不直接给你函数,给你函数地址,就这样调用        printf("%d\n", ret);}

    法二:
    我们在二.1取函数地址那一块介绍了,在函数指针这一块,函数名==&函数名, 也就是说创建函数指针的时候可以这样写:int(*p)(int, int) = Add,Add是赋给了p啊,你也可以认为:p就是Add。你可以这样理解,法一是int(*p)(int, int) = &Add,是把Add的地址给p,所以用p来调用函数要解引用一下,但是法二p就是Add,那不用解引用了,直接调用。代码如下:

    #includeint Add(int x, int y){        return x + y;}int main(){        //我们由前面的知识知道:函数add取地址时,add=&add        int(*p)(int, int) = Add;//把Add赋给p,这里p即可看做Add        //与法一不同的是,法一将&Add赋给p,p是Add的地址,所以要解引用,这里p就可以看做是Add本身,可以不解引用        int ret = p(3, 6);        printf("%d", ret);}//如果是为了方便理解,一般是用第一种方法,如果是为了操作方便,可以用第二种方法

    三、函数指针进阶

    大家来看这样一个代码( * (void(*)() ) 0)(),乍一看非常复杂,我们来细化一下
    1 . ( * (void( * )() ) 0)() 我们抽出加粗部分
    这是我们熟悉的老朋友:void( * )(),这不就是一个函数指针嘛,该函数无参,返回类型void

    2 . (void( * )() ) 0是什么?我们联想一下(int)3.14,不就是对3.14强制类型转换嘛,将3.14这个浮点型强制转换成整形。这里同样的道理,是将整形0强制转换成类型为void( * )()的一个函数指针

    3 .现在有了(void( * )() ) 0,我们在这个东西前面加一个 *,这个是什么意思,我们知道(void( * )() ) 0已经被转换成一个指针(指针即地址)了,地址前面加一个 *表示解引用,取出地址里的东西,也就是找到了那个函数

    4 .(void( * )() ) 0表示那个函数那再在后面加一个()即是对函数的调用,也就是( * (void(*)() ) 0)()

    感谢各位的阅读,以上就是"如何掌握C语言编程函数指针"的内容了,经过本文的学习后,相信大家对如何掌握C语言编程函数指针这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

    函数 指针 地址 类型 数组 就是 指向 代码 也就是 元素 参数 变量 方法 语言 语言编程 编程 不同 东西 字符 括号 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技网 科技创新与互联网经济 工业互联网科技新基建 互联网最新的科技有限公司 上海互联网科技有限公司 迪茉互联网科技 互联网科技论坛 重庆科技学院互联网 互联网教育科技公司vipkid 常德市电业局互联网科技部 来此购互联网科技有限公司 浙江互联网科技研学营 互联网科技大奖都有哪些公司 中国互联网十大科技股排名 中天科技中国工业互联网 广州梦谷互联网科技有限公司领导 北京互联网科技类企业分布 互联网科技的前景 安徽九吞吴互联网科技有限公司 北京瑞云互联网科技有限公司 互联网科技企业 狮子座互联网科技 互联网未来科技 易通互联网络科技有限公司 广州善班互联网科技 汉立互联网科技有限公司联系电话 银川新华互联网科技学校地址 浙江互联网科技研学营 四川互联网展示科技馆设计 北京品多多互联网科技有限公司
    0