指针函数和函数指针深入剖析

C语言的魅力所在在于指针,一脸懵圈,黑人问号也在于指针。

就像女孩子的心思,变幻莫测,无穷无尽,古灵精怪。

今天,我们就先来看一看女孩子心思之 --- 指针函数、函数指针。

 

1、指针函数:

看字面含义,指针是修饰函数的,所以,它是一个函数,返回值为指针。

看指针函数的声明:

int *point_func(void)

()优先级高于*,point_func先和()结合,所以 point_func()是一个函数,int和*结合,所以这个函数的返回值是个指针;

需要特别注意的是:

int *

point_func(void)

{

    请不要返回局部变量指针,

    比如,int a; return &a;

    因为局部变量指针这个地址,

    比如,0xaabbccdd,在函数结束就被回收了,

    它的值在函数返回后是不定的,

    所以,如果返回局部变量指针的话,会有不可预测的情况发生。

    稍等演示一下这种不定的情况。

    建议使用如下两种:

    1. static int *a;   //static变量,在程序结束之前,不会被回收;

    2. int *a = (int *)malloc(sizeof(int));  // 在堆空间上的分配,要用free才回收;

}

 

举个栗子:

#include <stdio.h>

#include <stdlib.h>


#define LOCAL_VAR

//#define STATIC_VAR

//#define HEAP_VAR


int *

point_func(void)

{

#ifdef LOCAL_VAR

    int a = 0;

    a = 134;

    return &a;

#elif (defined(STATIC_VAR))

    static int a = 0;

    a = 134;

    return &a;

#elif (defined(HEAP_VAR))

    int *a;

    a = (int*)malloc(sizeof(int));


    *a = 134;

    return a;

#endif

}


int

main(void)

{

    int *ppointfunc;


    ppointfunc = point_func();


    {

        int b, c, d;

        b = 13, c = 14, d = 15;

        printf("b = %d, c = %d, d = %d\n", b, c, d);

    }


    printf("point reutrn func ret = %d\n", *ppointfunc);


    #ifdef HEAP_VAR

    free(ppointfunc);

    #endif

    

    return 0;

}

 

这三个宏定义:

#define LOCAL_VAR            //返回局部变量指针

//#define STATIC_VAR        // static

//#define HEAP_VAR            // malloc

 

先打开第一个,编译,运行,看下结果:

看,这不是我们想要的 134 这个结果,而且,每次运行,不一定相同喔~

 

再打开第二个,编译,运行,看下结果:

 

接下来打开第三个,编译,运行,看下结果:

 

2、函数指针

看字面含义,函数是修饰指针的,所以,它是一个指针,指向函数。

看函数指针的声明:

void (*func_point)(int)

括号优先级最高,(*point_func)是一个指针,指向一个无返回值(void),参数为(int)的函数。

也就是说,它是个指针,用来指函数用的,只要是,无返回值,参数为int 的函数,都能指。

怎么指呢?比如:

void (*fp1)(int);

void func(int){}

fp = func;

我们就可以用 fp(1) 或者 (*fp)(1) 来调用 func函数。

 

举个栗子:

#include <stdlib.h>

#include <stdio.h>


void (*pf1)(int);

void (*pf2)(int);

void (*pf3)(int);


void

print_var(int a)

{

    printf("var = %d\n", a);

}


int

main(void)

{

    pf1 = print_var;

    pf2 = print_var;

    pf3 = print_var;


    pf1(13);

    (*pf2)(14);

    pf3(1314);

    

    return 0;

}

编译,运行,看下结果:

代码里定义函数指针,每次基本上都要把函数原型敲一遍,会不会很繁琐呢?

void (*pf1)(int);

void (*pf2)(int);

void (*pf3)(int);

如果觉得繁琐的话,请移步《typedef 详解

更深入点,请移步《signal原型:返回值是函数指针的函数

 

总结:

指针函数:返回值为指针的函数,是一个函数,它的返回值是指针;

函数指针:指向函数的指针,是一个指针,它指向函数;

指针函数,函数指针,亲们搞混了没?~~~~

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值