本文的主要内容目录:
一、函数指针的引入
二、函数指针的简单运用
一、函数指针的引入
在C语言当中,指针的使用非常重要的。我们都知道有变量指针,可以通过这个变量指针来访问这个变量;那么有没有函数指针呢,如果有的话能不能通过这个函数指针来访问这个函数呢?答案是肯定的。在说什么是函数指针之前,先引入一个简单的例子,如下所示:
#include <stdio.h>
/* 打印Hello,world! */
void print_hello(void)
{
printf("Hello,world!\n");
}
/* 程序的入口函数 */
int main(int argc, char *argv[])
{
void (*fun_ptr)(void); /* 定义一个指针变量 */
fun_ptr = print_hello; /* 赋值并调用 */
fun_ptr();
return 0;
}
编译并运行,结果如下:
上面这段代码当中void (*fun_ptr)(void); 这个语句的定义是比较奇怪的,但是通过分析发现当对里面的fun_ptr 赋值为 print_hello这个函数名,然后再fun_ptr()就会打印出来Hello'world!,和直接调用print_hello()的结果是一样的。其实void (*fun_ptr)(void);,就是定义一个函数指针变量,而print_hello这个函数名本身就可以表示这个函数的所在的地址,所以将其赋值给fun_ptr,在调用fun_ptr()就可以打印出Hello.world!了。函数指针变量的定义形式如下:
返回值 (*函数指针变量民)(形参列表)
从上面分析可以看出,要想将一个函数的地址赋值给一个函数指针变量必须保证它的返回值、形参列表和要赋值的函数保持一致。
二、函数指针的简单运用
函数指针的作用在C语言当中是十分巨大的,可以说稍微有一点规模的程序都会涉及到函数指针。本文就结合两个小例子来简单说一说函数指针的使用。
1、第一个小例子
让用户通过自己输入选择来决定是调用哪一个函数,根据用户的输入对函数指针变量赋值相应的函数地址。具体如下:
#include <stdio.h>
/* 打印Hello,world! */
void print_hello(void)
{
printf("Hello,world!\n");
}
void print_goodbye(void)
{
printf("Goodbye,world!\n");
}
/* 程序的入口函数 */
int main(int argc, char *argv[])
{
void (*fun_ptr)(void); /* 定义一个指针变量 */
int code;
print_usage:
printf("Input a code <0|1>: ");
scanf("%d", &code);
switch(code)
{
case 0 : /* 输出Hello,world! */
fun_ptr = print_hello;
break;
case 1 : /* 输出Goodbye,world! */
fun_ptr = print_goodbye;
break;
default : /* 打印用法,重新进行输出选择 */
goto print_usage;
break;
}
fun_ptr(); /* 输出选择的打印 */
return 0;
}
运行结果如下:
分析代码可知,根据用户输入决定给函数指针赋予相应的函数地址,从而决定调用相应的函数。可以想象在项目开发过程当中,可能同一类型的函数有多个,此时调用那个需要根据具体的情况来做出选择,这时候就发挥出了函数指针的作用。
2、第二个小例子
定义一个学生的结构体,要求在结构体内部定义一个函数指针,通过调用这个函数指针来打印出学生的信息。具体代码如下:
#include <stdio.h>
/* 定义一个标识学生信息的结构体 */
struct student {
int age; // 年龄字段
char *name; // 名字字段
char *addr; // 地址字段
void (*show)(struct student *); // 定义一个函数指针变量
};
/* 定义一个打印学生信息的函数 */
void show_student_info(struct student *obj)
{
printf("student information :\n");
printf("\tage : %d\n", obj->age);
printf("\tname : %s\n", obj->name);
printf("\taddr : %s\n", obj->addr);
}
/* 程序的入口函数 */
int main(int argc, char *argv[])
{
struct student A; // 定义一个表示学生的结构体变量A
/* 对A进行赋值 */
A.age = 20;
A.name = "zhangsan";
A.addr = "Beijing";
A.show = show_student_info;
/* 打印学生A的信息 */
A.show(&A);
return 0;
}
编译并运行,结果如下:
像上面这样的写法是很常见的,也是C语言做项目开发中基本都会用到的形式,有点儿面向对象编程的意思。
关于函数指针的用法在C语言当中是非常重要的,而且使用的形式是多种多样的,作用也是不尽相同的,本文只是简单的说一说而已。不足挂齿,呵呵。