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原型:返回值是函数指针的函数》
总结:
指针函数:返回值为指针的函数,是一个函数,它的返回值是指针;
函数指针:指向函数的指针,是一个指针,它指向函数;
指针函数,函数指针,亲们搞混了没?~~~~