函数指针

举报
芒果_Mango 发表于 2022/03/28 10:32:37 2022/03/28
【摘要】 大家好,我是芒果,一名非科班的在校大学生。对C/C++、数据结构、Linux及MySql、算法等领域感兴趣,喜欢将所学知识写成博客记录下来。 希望该文章对你有所帮助!如果有错误请大佬们指正!共同学习交流作者简介:CSDN C/C++领域新星创作者https://blog.csdn.net/chuxinchangcun?type=blog掘金LV3用户 https://juejin.cn/us...

大家好,我是芒果,一名非科班的在校大学生。对C/C++、数据结构、Linux及MySql、算法等领域感兴趣,喜欢将所学知识写成博客记录下来。 希望该文章对你有所帮助!如果有错误请大佬们指正!共同学习交流

作者简介:

12.函数指针

函数指针变量->存放函数的地址(指向函数)

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

结果发现:二者打印的结果相同

image-20220214210135849

和数组对比:

&数组名 -数组的地址
数组名 - 数组首元素地址
二者打印出来的地址值相同,但是含义不相同

但是函数名和&函数名一样!!


int Add(int x, int y)
{
    return x + y;
}
int main()
{
    int arr[10] = { 0 };
    int(*parr)[10] = &arr;//parr就是数组指针变量,指向一个数组,数组有10个元素,每个元素是int类型
    int(*pf)(int, int) = Add;//此时of是用来存放函数的地址-pf就是函数指针变量
    //这样写也可以:int(*pf)(int, int) = &Add; //Add和&Add含义一样
    //这样也可以int(*pf)(int x,int y) = &Add;
    printf("%d\n", (*pf)(2, 3));	//5
    printf("%d\n", pf(2, 3));	//5
    return 0;
}

去掉名字就是类型

int a = 10;// a的类型为:int
int arr[10] = {0};// arr的类型为:int [10]
int(*p)[10] =&arr;//p的类型->int(*)[10]
int(*pf)(int,int) = Add;//pf为函数指针,函数指针类型为:int(*)(int,int)

注意:()优先级比*高

若写成:int*pf(int,int);	//此时pf先和()结合,是函数,参数为int int  返回类型为int*
正确写法:int(*pf)(int,int);//此时pf才是指针,函数指针,指向的函数的参数是int,int,返回类型是int

int(*pf)(int,int) = Add

写法1:pf(2,3);

写法2:(*pf)(2,3)

两种写法都可以,

对于写法1:pf能接收函数Add,说明pf == Add

*对于写法2pf指向函数(存放函数的入口地址),pf就可以调用函数

当然了,前面写多个*也不会影响

**(**pf)(2,3) == pf(2,3) == (*pf)(2,3)


奇葩代码:
代码1: (*(void(*)())0)()
代码2:void (*signal(int,void(*)(int)))(int)

回调函数:

  • 回调函数就是一个通过函数指针调用的函数
  • 回调函数一般通过函数指针实现
  • 回调函数一般不是函数的实现方调用,而是在特定的场景下,由另外一方调用
  • 回调函数是调用函数指针指向的函数
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。