0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言中函数指针详解

CHANBAEK 来源:博客园-LSWen 作者:博客园-LSWen 2023-02-15 14:50 次阅读

C语言中函数指针

函数调用的方法有两种分别如下:

void Fun(void)
{
    //do something
}

int main(void)
{
   ...
   Fun();
   ...
   return 0;
}
void Fun(void)
{
  //do something
}

int main(void)
{
   ...
   void (*p)(void);
   p=Fun;
   p();    
   return 0;
}

上面两种方式都可以调用函数,第二种方式在回调函数中用的最多,尤其是在操作系统的任务切换中。 那么我们就重点来分析下第二种方式。

第二种方式申明了一个函数指针p,那为啥写成void(p)(void)? 为啥不直接写成p,不是说了函数名就是该函数的入口地址,为啥不直接把该地址传给指针呢,这样既好理解又方便省事,其实这样想不无道理,但是在C语言中有变量类型这个东东,比如int赋值给char,编译器就会报错,同样的道理函数也有类型,那么既然函数有类型,我们如何知道变量类型呢。 现在写一个程序如下,注意,程序有错误,这个错误是故意写的,目的就是让编译器报错,使用编译器为gcc。

#include "stdio.h"

void Fun(void)
{
    printf("hello world");    
}

int main(void)
{
    void *p;
        p=Fun;
    return 0;
}

下面是编译器输出:

g++.exe -x c++ -c C:\\Users\\Administrator.SC-201903191934\\Desktop\\unknown1.c -o C:\\Users\\Administrator.SC-201903191934\\Desktop\\unknown1.o -Wall -fallowive -Wno-sign-compare -g

C:\\用户\\管理员.SC-201903191934\\桌面\\未知1.c:在函数中 int main()':** **C:\\Users\\Administrator.SC-201903191934\\Desktop\\unknown1.c:12: warning: invalid conversion from 空 ( )()' 改为 '无效 '

编译器报错意思是不能讲void ( )()类型转化为void 类型。 这个警告就说明了函数Fun的类型是( )()类型,而申明的指针类型是 ,两个类型不一致,故导致其错误,既然这样,那么如何申请一个指针类型为( )()的呢? C语言中给了函数指针这个类型,即( )()类型,因此为了让指针指向一个函数地址,只需要声明一个(*)()类型即可。

如下:

#include "stdio.h"

void Fun(void)
{
    printf("hello world"); 

 } 

int main(void)
 {
void (*p)(void); //函数指针
     p=Fun; return 0;
 }

这样就将函数Fun的地址给指针p了,与其说p是一个函数指针,倒不如说p是一个函数名,只是没有什么其函数内部,这里可以从旧式的函数申明上可以看出。

因此要运行这个所谓的函数p,只需要和函数使用一样就行,p();

现在再来看一个代码:

void *Fun(void)
{
    printf("hello world");    
    return NULL;
}

这里函数Fun改为了有返回值的函数,其返回值为指针void *类型,那么我们如何来声明一个指针指该函数呢?

从上门面分析可以看出,该函数的类型应该是*(*)(); 所以现在我们需要声明一个相同类型的指针,即void *(*p)(void); 这样就只需要p=Fun; 就可以达到目的了。

#include "stdio.h"

void *Fun(void)
{
    printf("hello world");    
    return NULL;
}

int main(void)
{
    void *(*p)(void);
    p=Fun;
    return 0;
}

**总结:

函数名也是有类型的,因此在C语言中,必须严格遵守类型匹配原则。
函数名的类型为(*)()类型,如果有返回值,则在最前面增加返回类型即可,例如
int * Fun(int,int ); 其函数类型为 ()(int,int),对应的函数指针为int **(*p)(int,int);

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7604

    浏览量

    136767
  • 函数
    +关注

    关注

    3

    文章

    4329

    浏览量

    62588
  • 指针
    +关注

    关注

    1

    文章

    480

    浏览量

    70559
  • 编译器
    +关注

    关注

    1

    文章

    1634

    浏览量

    49121
  • 回调函数
    +关注

    关注

    0

    文章

    87

    浏览量

    11557
收藏 人收藏

    评论

    相关推荐

    C语言中void指针的基本认识及典型应用

    C语言中,*类型就是指针类型,比如 int *p,double *q,虽然是不一样的指针,但是大小却一样sizeof(p) == sizeof(q),因为它们都是同一种类型*类型的。
    发表于 02-01 09:26 1099次阅读

    C语言中指针函数函数指针的概念及应用示例

    C语言中指针函数函数指针是强大且常用的工具。它们允许我们以更灵活的方式处理
    发表于 08-16 16:14 886次阅读

    C语言中多级指针的概念和使用方法

    多级指针C语言中是一种特殊的指针类型,它可以指向其他指针指针
    发表于 08-16 16:16 1099次阅读

    c语言指针详解

    不同,有4字节或者8字节或者其他可能)。  第二,指针使得一些复杂的链接性的数据结构的构建成为可能,比如链表,链式二叉树等等。  第三,有些操作必须使用指针。如操作申请的堆内存。还有:C语言中
    发表于 03-26 09:51

    C语言中指针是什么?如何规避野指针

    C语言中指针是什么?有哪几种类型?指针有何作用?如何规避野指针
    发表于 02-25 06:47

    C语言中指针的介绍非常详细

    C语言中指针的介绍非常详细 C语言中指针的介绍非常详细
    发表于 12-25 10:39 57次下载

    C语言指针函数函数指针详细介绍

    C语言指针函数函数指针详细介绍。。。。。。。
    发表于 03-04 15:27 5次下载

    C语言指针函数访问

    C语言指针函数访问
    发表于 12-16 17:23 1次下载

    c语言函数指针定义,指针函数函数指针的区别

     往往,我们一提到指针函数函数指针的时候,就有很多人弄不懂。下面就由小编详细为大家介绍C语言中
    发表于 11-16 15:18 3625次阅读

    C语言的精髓——指针详解

    C语言的精髓——指针详解
    发表于 11-30 14:43 17次下载

    C语言中的野指针是怎么来的?

    )、malloc函数申请堆内存返回的地址(但未使用free释放,是在堆空间动态申请) 需要注意的是,野指针不是NULL指针,通常NULL指针可以使用if语句来判断,但是
    的头像 发表于 06-01 16:43 2558次阅读

    C语言中指针(重点)超详细

    C语言中指针1、指针是什么2、指针指针类型2.1、指针
    发表于 01-13 14:10 11次下载
    <b class='flag-5'>C</b><b class='flag-5'>语言中</b>的<b class='flag-5'>指针</b>(重点)超详细

    C语言中什么是指针数组

    C语言中一个数组,若其元素均为指针类型数据,称为指针数组,也就是说,指针数组中的每一个元素都存放一个地址,相当于一个
    的头像 发表于 03-10 15:26 1767次阅读

    简述C语言中指针重点

    C语言中一个函数可以返回一个整型值、字符值、实型值等,也可以返回指针型的数据,即地址,其概念与以前类似,只是返回的值的类型是指针类型。
    的头像 发表于 03-10 15:28 603次阅读

    c语言指针用法详解:如何使用指针变量做函数参数

    指针C语言中一个比较重要的东西,有人说指针C语言的灵魂这句话说的一点也没错。 正确灵活地运用
    发表于 09-21 12:32 1097次阅读
    <b class='flag-5'>c</b><b class='flag-5'>语言</b><b class='flag-5'>指针</b>用法<b class='flag-5'>详解</b>:如何使用<b class='flag-5'>指针</b>变量做<b class='flag-5'>函数</b>参数