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

    文章

    7533

    浏览量

    128817
  • 函数
    +关注

    关注

    3

    文章

    3903

    浏览量

    61310
  • 指针
    +关注

    关注

    1

    文章

    473

    浏览量

    70364
  • 编译器
    +关注

    关注

    1

    文章

    1577

    浏览量

    48627
  • 回调函数
    +关注

    关注

    0

    文章

    87

    浏览量

    11456
收藏 人收藏

    评论

    相关推荐

    C语言中函数的返回值指向一个指针

    函数的返回值类型必须与函数体内的返回表达式的类型相匹配。如果类型不匹配,编译器会报错。此外,C 语言中函数只能返回一个值,如果需要返回多个值,可以使用结构体或
    的头像 发表于 04-26 11:01 2022次阅读
    C<b class='flag-5'>语言中</b><b class='flag-5'>函数</b>的返回值指向一个<b class='flag-5'>指针</b>

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

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

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

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

    c语言指针详解

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

    【每日一知识点】C语言中const详解

    马上就想到了常量。事实上在C语言中const功能很强大,它可以修饰变量、数组、指针函数参数等。1、 修饰变量:C
    发表于 03-29 10:53

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

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

    C语言中如果没有二重指针行不行

    指针数组与数组指针是什么?有何区别?函数指针是什么?怎样去使用函数指针呢?二重
    发表于 02-25 07:29

    C语言中数字怎么转成指针

    C语言中数字怎么转成指针,比如我要去内存地址为0x100的内容,用一句话表达,不如uchar a=?我要问号等于0x100地址的内容
    发表于 10-31 06:29

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

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

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

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

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

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

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

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

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

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

    C语言中什么是指针数组

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

    简述C语言中指针重点

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