对函数指针、 函数指针数组、 指向函数指针数组的指针的理解

函数指针:

   函数指针,是一个指针,一个指向函数的指针。
我们来看一段代码:

#include<stdio.h>
#include<stdlib.h>

void test()
{
    printf("hehe\n");
}

int main()
{
    printf("%p\n", test);//函数的地址
    printf("%p\n", &test);//函数名的地址
    system("pause");
    return 0;
}

来看它的运行结果:
这里写图片描述
我们发现这两个地址相同,那说明函数名的地址和函数的地址是相同的。
那我们想把test函数的地址保存起来,应该怎么存呢?
   首先,能够存地址,那肯定是个指针类型,然后该指针指向函数,而且test函数的返回类型是void。所以这个变量可以存该函数的地址:

void (p*)();//这个变量p就是函数指针

我们来看个有趣的代码:

(*(void(*)0))();//其实就是实现函数调用

我们来分析一下这个代码:
1.void(*)()为函数指针类型,这个函数没有类型,没有返回值
2.(void(*)())0将0强转为函数指针类型
3.(*(void(*)())0)对0这个函数指针解引用得到函数
4.(*(void(*)())0)()这是函数调用。

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

分析这句代码:
1.signal为函数
2.函数的参数有两个,第一个是i整型,第二个是函数指针,该函数指针指向的函数有一个整型参数,返回类型为void
3.signal函数的返回类型为一个函数指针,该指针指向的函数有一个整型参数,返回值为void

函数指针数组:

函数指针数组就是存放指针的数组。
那函数指针数组该怎么书写呢?
我来定义一个函数指针数组:

int (*parr[10])();

   parr先和[ ]结合,说明parr是数组,那数组的内容是什么呢?是int (*)(),也就是说该数组里有10个元素,每个元素都是函数指针类型。
函数指针怎么使用呢?我们来看个简单的例子:

#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;
}

void calc(int (*pfun)(int,int))
{
    int x = 0;
    int y = 0;
    int ret = 0;
    printf("请输入两个操作数:");
    scanf("%d%d",&x,&y);
    ret = pfun(x,y);//传过来的是函数指针,所以传过来直接用就行了
    printf("ret=%d\n",ret);
}

void menu()
{
    printf("****************************\n");
    printf("*****  1.Add    2.Sub  *****\n");
    printf("*****  3.Mul    4.Div  *****\n");
    printf("*****      0.exit      *****\n");
    printf("****************************\n");
}

int main()
{
    int (*pfun[5])(int,int) = {0,Add,Sub,Mul,Div};
    // int (*pfun[5])(int,int)就是一个函数指针数组,该数组有5个元素,该数组存的是上面4个计算函数的地址,(第一个元素是0,是为了方便使用),
    //每个元素时函数指针类型,这个函数指针所指的函数有个整型参数,返回值是整型。
    int input = 0;
    do
    {
        menu();
        printf("请选择:");
        scanf("%d",&input);
        if(input>=1 && input<=4)
        {
            calc(pfun[input]);//传的就是函数指针
        }
        else if(input == 0)
            printf("退出\n");
        else
            printf("选择错误\n");
    }while(input);
    return 0;
}

函数指针数组的指针:

这标题看着就有点发狂啊!
函数指针数组的指针,就是一个指针,该指针指向函数指针数组,这个数组里的元素是函数指针。
下面我来定义一个函数指针数组的指针:

int (*(*p)[10])();

1.(*p)说明p是指针
2.(*p)[10]说明该指针指向含有10个元素的数组
3.int (*)( )说明这个数组里的元素是函数指针类型

最后我们通过一个例子,把函数指针、 函数指针数组、 指向函数指针数组的指针放一块来看:

#include<stdio.h>
#include<stdlib.h>

void fun()
{
    printf("hehe\n");
}
int main()
{
    //定义一个函数指针pfun,该函数的返回值类型为void,没有参数
    void(*pfun)() = fun;

    //定义一个函数指针数组,存放函数指针,该数组有5个元素,每个元素都是函数指针类型
    void(*pfunArr[5])();

    //将函数的地址放在函数指针数组首元素内
    pfunArr[0] = fun;

    //将函数指针数组的地址存放在指向函数指针数组的指针内
    void(*(*pptestArr)[10])() = &ptestArr;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/jsbgo201506010102/article/details/80139559