一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情。
大家好,我是芒果,一名非科班的在校大学生。对C/C++、数据结构、Linux及MySql、算法等领域感兴趣,喜欢将所学知识写成博客记录下来。 希望该文章对你有所帮助!如果有错误请大佬们指正!共同学习交流
作者简介:
- CSDN C/C++领域新星创作者blog.csdn.net/chuxinchang…
- 掘金LV3用户 juejin.cn/user/138142…
- 阿里云社区专家博主,星级博主,技术博主 developer.aliyun.com/profile/exp…
- 华为云云享专家 bbs.huaweicloud.com/community/m…
1.复习
关于函数
int Add(int x,int y)
{
return x+y;
}
&Add 和Add是完全相同的
而对于数组,&arr 和arr虽然地址值一样,但是含义是不一样的。
&arr+1:跳过一个数组的内容 arr+1:跳到第二个元素
函数指针
int Add(int x,int y)
{
return x+y;
}
int Sub(int x , int y)
{
return x -y;
}
int main()
{
int(*pA)(int,int) = Add;
//也可以写成 int(*pA)(int x,int y) = &Add;
//Add和&Add是一回事
//含义:pA是指针,是函数指针,指向的函数的参数是(int,int),返回类型是int
int(*pB)(int,int)=Sub;
//含义:pB是指针,是函数指针,指向的函数的参数是(int,int),返回类型是int
int ret = (*pA)(2,3); //pA指向Add函数,解引用指针就是该该函数
int ret2 = pA(2,3); //pA能接收该函数,说明pA == Add,其实也源于 &Add == Add 所以不需要解引用代表的也是Add
int ret3 = Add(2,3);
int ret4 = (&Add)(2, 3);
printf("%d %d %d %d\n", ret, ret2, ret3,ret4);// 5 5 5 5
}
函数指针数组和指向函数指针数组的指针
函数指针数组:是数组,数组元素是函数指针
指向函数指针数组的指针:是指针,指向函数指针数组
int Add(int x,int y)
{
return x+y;
}
int Sub(int x , int y)
{
return x -y;
}
int main()
{
int (*pArr[3]) (int,int) = {Add,Sub};
//也可以写成: int (*pArr[3]) (int x,int y) = {Add,Sub};
//pArr是函数指针数组,
//去掉数组名和元素个数就是数组元素类型
//-> int(*)(int ,int) ->数组元素类型为函数指针
int(*(*p)[3])(int,int)=&pArr;
//p是数组指针,是指针
//该指针指向一个数组,数组元素为3个
//去掉数组名和元素个数就是数组元素类型 (去掉(*p)[3])
//-> int(*)(int,int) ->函数指针
//所以该数组是函数指针数组,元素个数为3个
//p是指向函数指针数组的指针
int ret = (*pArr)(2, 3);
printf("%d ", ret); //5
int ret2 = (*(*p))(2, 3);
printf("%d", ret2); //5
return 0;
}
首先明确:pArr:函数指针数组 p:指针,指向函数指针数组的指针
pArr:数组名->首元素地址 一级指针
&pArr:数组的地址->地址值和首元素地址一样,但是含义不一样
p:存放的内容为:数组pArr的地址 相当于二级指针
&p:指针变量自身的地址
所以 *p == pArr pArr[0] == *(pArr+0) == *(*p+0)
回调函数
int Add(int x, int y)
{
return x + y;
}
int Sub(int x, int y)
{
return x - y;
}
//使用函数指针接收
void Calc(int(*pf)(int, int))
{
//输入两个操作数
int a = 0;
int b = 0;
printf("请输入两个操作数\n");
scanf("%d %d", &a, &b);
int ret = pf(a,b); //调用传过来的函数
printf("运算结果为:%d\n", ret);
}
int main()
{
Calc(Add);
Calc(Sub);
return 0;
}