函数指针
【摘要】 大家好,我是芒果,一名非科班的在校大学生。对C/C++、数据结构、Linux及MySql、算法等领域感兴趣,喜欢将所学知识写成博客记录下来。 希望该文章对你有所帮助!如果有错误请大佬们指正!共同学习交流作者简介:CSDN C/C++领域新星创作者https://blog.csdn.net/chuxinchangcun?type=blog掘金LV3用户 https://juejin.cn/us...
大家好,我是芒果,一名非科班的在校大学生。对C/C++、数据结构、Linux及MySql、算法等领域感兴趣,喜欢将所学知识写成博客记录下来。 希望该文章对你有所帮助!如果有错误请大佬们指正!共同学习交流
作者简介:
- CSDN C/C++领域新星创作者https://blog.csdn.net/chuxinchangcun?type=blog
- 掘金LV3用户 https://juejin.cn/user/1381426159953960
- 阿里云社区专家博主,星级博主,技术博主 https://developer.aliyun.com/profile/expert/5lkdbuggiiuhc
- 华为云云享专家 https://bbs.huaweicloud.com/community/myhomepage
12.函数指针
函数指针变量->存放函数的地址(指向函数)
int Add(int x ,int y)
{
return x+y;
}
int main()
{
printf("%p\n",&Add);
printf("%p\n",Add);
return 0;
}
结果发现:二者打印的结果相同
和数组对比:
&数组名 -数组的地址
数组名 - 数组首元素地址
二者打印出来的地址值相同,但是含义不相同
但是函数名和&函数名一样!!
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)