函数指针数组和函数指针数组指针
我们来看看今天的标题,你有没有觉得晕乎乎的,之前小企鹅发过一篇关于函数指针的用法,但是有粉丝反应没讲完全,所以今天答应给粉丝更新的一篇关于函数指针的深入探讨文章。
函数指针数组
我们看最后数组两个字,我们学C语言再也熟悉不过了吧,就是同一个类型的数据组成的数据集合,然后我们再往前看,它是“指针”什么意思,就是这个数组里面装的数据集合都是是指针,那我们都知道C语言指针也是分类型的,有整型指针,字符型指针,浮点型指针就,结构体指针等等,但是我们看最开始的“函数”,那说明我们这个数组里面的指针类型是函数。
我们举个例子看一下啊;
#includestdio.h
#includestring.h
char*fun1(char*p)
{
printf("%s\n",p);
return0;
}
char*fun2(char*p)
{
printf("%s\n",p);
return0;
}
char*fun3(char*p)
{
printf("%s\n",p);
return0;
}
intmain()
{
char*(*pfun[3])(char*p);//我们定义一个函数指针指针数组;
char*(*(*ptrfun)[3])(char*p);//定义一个函数指针数组指针;
//printf("fun1=%u\n",fun1);
//给我们的数组赋值
/*
pfun[0]=fun1;//把函数fun1赋值给数组第一个元素,直接使用函数名;
pfun[1]=fun2;//我们也可以在函数名前面加吧地址付给第二个元素;
pfun[2]=fun3;//给数组第三个元素赋值;
*/
ptrfun=pfun;//把函数指针数组的地址赋值给指针ptrfun;
pfun[0]=fun1;//把函数fun1赋值给数组第一个元素,直接使用函数名;
pfun[1]=fun2;//我们也可以在函数名前面加吧地址付给第二个元素;
pfun[2]=fun3;//给数组第三个元素赋值;
//使用
/*
pfun[0]("函数fun1");
pfun[1]("函数fun2");
pfun[2]("函数fun3");
*/
ptrfun[0][0]("指针调用函数fun1");
ptrfun[0][1]("指针调用函数fun2");
ptrfun[0][2]("指针调用函数fun3");
//printf("fun1=%u\n",fun1);
//printf("fun1=%u\n",fun1);
return0;
}
结果
结果和我们直接使用fun1、fun2、fun3效果是一样的。
在这里我觉得可以再讲一个知识点,我们看代码中给第一个元素赋值是直接使用函数名,而后面两个用的都是修饰的函数呢?他们有什么区别,我们来看一下下面的这个代码,我们在刚刚的代码打印出fun1和fun1的值看一下;
printf("fun1=%u\n",fun1);
printf("fun1=%u\n",fun1);
结果如下图:
结果分析我们可以看到其实打印出来的值是一样,所有我们其实可以认为函数名教师函数的地址。
我们的函数指针数组就讲到这里了,包括对函数指针的定义,使用都给大家讲解了。
函数指针数组指针
我先解释一下这个名字到底是什么吧,首先“函数指针数组”和我们刚刚在上面分析的一样,就是一个数组,数组里面的元素是函数指针,那我们再看最后两个字“指针”这说明说明,说明他是一个指针呀,比如我们说“XXX数组”,那它就是数组,这里我们看成“XXX指针”那它就是一个指针,既然他是一个指针那它是谁的指针?他是一个数组的指针,它指向一个数组,数组里面都是函数类型的指针。
char*(*(*ptrfun)[3])(char*p);//定义一个函数指针数组指针;
ptrfun=pfun;//把函数指针数组的地址赋值给指针ptrfun;
pfun[0]=fun1;//把函数fun1赋值给数组第一个元素,直接使用函数名;
pfun[1]=fun2;//我们也可以在函数名前面加把地址付给第二个元素;
pfun[2]=fun3;//给数组第三个元素赋值;
结果分析
我们可以发现函数指针数组指针对函数的调用结果也是和直接调用函数、调用函数数组元素一样的都可以对我们的函数进行调用。
现在你对函数指针数组和函数指针数组指针有更好地理解了么?我们再看下面这两个表达式:
int*(*fun[3])(char*p);
int*(*(*fun)[3])(char*p);
你现在可以解释这两个表达式个表示的意思了么?