指针函数 和 函数指针

指针函数

  可以根据字面意思理解为:返回值为指针的函数。

  他的本质是一个函数,跟其他函数的区别就在于,指针函数的返回值类型是指针。

  举个例子:

int fuc(void)
{
    return 5;
}

  这个函数fuc返回值是int类型,并且返回值为5.

  那么指针函数什么样呢?

int *fuc(void)
{
    return 5;
}

  这个函数也是fuc,跟上面函数不同的是,他返回值是int * 类型,也就是返回一个指针,这个指针指向int整形数字5的地址。

  使用指针函数时要注意,传出的指针不要指向局部变量的地址

  比如:

int *fuc(void)
{
    int a = 5;
    return a;
}

  这个例子就是错误的,(当然,如果不是指针函数,那么这种用法没有问题)

  本例中返回值为int形a的地址,但是a是局部变量,再fuc结束之时局部变量被回收,所以我们不可能得到5这个数字。

函数指针

  根据字面意思来理解,函数指针就是:指向函数的 指针。

  他的本质是一个指针,我们平时使用指针

  比如:

int a = 5;
int *p;
p = a ;

  指针p指向了一个整型数字a的地址,这个地址里存着的就是数字5.

  那么函数指针,指向了一个函数

int (*p)(int);

  这个函数指针的名字是p,指向一个参数为int 返回值为int的函数,或者这样表达,指针p指向的函数类型为  int ()(int)

  

  根据我的理解,函数指针和其他的指针在基本的使用上是一样的,就是说,这个指针名字,可以替代函数名字出现

int fuc(void)
{
    int a = 5;
    return a;
}

int main(int argc, char const *argv[])
{
    int (*p)(void);
    p = fuc;
    printf("%d\n", fuc());
    printf("%d\n", p());
    printf("%d\n", (*p)());
    return 0;
}

  函数指针p指向了fuc这个函数,所以 fuc() 和 p() 就是等价的,而 p() 跟 (*p)()是一样的,所以编译后输出结果是:

5
5
5

  这里注意,如果我用

    printf("%d\n", *p());

  这就是错误的用法。

  既然它的本质是指针,那么我们就也可以把这个指针当作参数 传入另一个函数

int plus(int x,int y)
{
    return x + y ;
}

int jian(int x,int y)
{
    return x - y;
}

int jisuan(int (*p)(int,int),int x,int y)
{
    return (*p)(x,y);
}

int main(int argc, char const *argv[])
{

    printf("%d\n", jisuan(jian,1,2));
    printf("%d\n", jisuan(plus,1,2));

    return 0;
}

  本例中我们将 int (*p)(int,int) 作为参数传入了其他的函数中,达到了用一个函数去灵活调用其他同类型函数的目的。

猜你喜欢

转载自www.cnblogs.com/qifeng1024/p/12452893.html