0
点赞
收藏
分享

微信扫一扫

c神功秘籍第二章(指针详解)(第二节)

树下的老石头 2022-01-20 阅读 99

上节我们分别讨论完了指针数组和数组指针,如果还有社么不懂得地方可以私信或评论区留言我们再接着说。接下来我们继续讨论他们的兄弟函数指针(想不到吧哈哈)

一、函数指针

1、概念:与数组指针类似,是指向并且用来存放函数地址的指针。

2、定义和使用:

#include<stdio.h>
int Add(int x,int y)
{
return x+y;
}
int main()
{
int (*pa)(int,int)=Add;    //函数指针的定义
printf("%d\n",(*pa)(2,3));    
return 0;
}

分析:函数指针的基本结构,因为本质上要满足是指针所以加()把*pa结合成为指针,然后int,int是指向函数的参数类型,其中可以只写类型int也可以加上int x int y参数名字。printf函数参数链式访问解引用后的pa传参2,3进行计算,最终打印5。

3、拓展延申

接下来给大家看两个关于函数指针有趣的声明。

(1)(*(void (*)())0)();

分析:对于这种可读性差的我们只能一层一层去剥开他,,先看void(*)()就代表了一个返回值为void的函数指针,然后我们看到了0,这就想起了(数据类型)常量/变量的格式吧,既是强制类型转换0为函数指针,然后再看到*解引用找到了函数地址,外面的()进行调用,所以这段代码是一次函数调用。

(2)void(*signal(int,void(*)(int)))(int);

分析:是不是更加抽象难读了,没办法还是慢慢啃吧。看到了里面的void(*)(int)说明这是一个void类型的指针,作为signal函数的参数,而signal又作用于返回值为void的指针类型是右边int,所以是一个函数指针。

4、*对函数指针的作用

#include<stdio.h>
int add(int x,int y)
{
return x+y;
}
int main()
{
printf("%d\n",add(2,3));
printf("%d\n",*add(2,3));
printf("%d\n",**add(2,3));
printf("%d\n",***add(2,3));
return 0;
}

 这些代码的结果都是5,可以知道*对函数指针可有可无,推荐不写或只写一个可读性可高

三、函数指针数组

        没错你没有看错,函数指针还有个大哥叫函数指针数组

1、概念:用来存放函数指针地址的数组,本质上是数组。

2.定义和使用:

#include<stdio.h>
int add(int x,int y)
{
return x+y;
}
int sub(int x,int y)
{
return x-y;
}
int mul(int x,int y)
{
return x*y;
}
int div(int x,int y)
{
return x/y;
}
int main()
{
int(*parr[4])(int,int)={add,sub,mul,div};
int i=0;
for(i=0;i<4;i++)
{
     printf("%d\n",parr[i](2,3))
}
return 0;
}

分析:类型是有4个函数指针的元素数组,且每个元素参数类型为int,用for循环遍历打印函数指针分别的结果,因为函数指针*可写可不写,所以解引用不写。

好了这一节的内容就到这了,期待我们下一节的内容吧,感谢你的阅读。

举报

相关推荐

0 条评论