722 字
4 分钟
函数指针与指针函数
一、概念
函数指针: 本质上是一个指针,但指向的是一个函数首地址(指针不能偏移),可以用函数指针来传递函数,常用于回调函数中
指针函数: 本质上是一个函数,函数的返回值是一个指针,常用于返回数组、字符串等数据结构指针
二、创建形式
2.1 普通函数创建形式: 形式为:变量类型+ 函数名(参数)
例子如下:
char fun(char arg);
2.2 指针函数创建形式:
形式为:指针类型 + 函数名(参数)
例子如下:
char* fun(char arg){ //函数内容 return 0;}
2.3 函数指针创建形式:
形式为:指针类型 + 函数名(参数)
例子如下:
char (*fun)(char); //定义一个函数指针char fun_1(char x) //定义一个函数体{ //函数内容 return 0;}fun= & fun_1 //函数体与指针相关联
三、使用例子
3.1 指针函数返回字符串
以典型的字符串复制函数 strcpy
为例子,传入两个字符串a、b指针做参数,拷贝b的内容到a之后返回a的指针
char* strcpy(char* a,char* b){ char* c=a; //拷贝a的地址 assert((a != NULL) && (b != NULL)); //判断输入正常 while((*c++ = *b++)!='\0'); //使用拷贝的地址进行自加,将b的程序赋值到a中 return a; //返回a的地址}
assert(条件语句):断言函数,相当于一个if判断句,判断内容为真时程序正常运行,为假则报错,终止程序执行
3.2 函数指针做回调函数
回调函数就是一个通过函数指针调用的函数,我们把函数的**指针(地址)**作为参数传递给另一个函数,然后在该函数中使用地址来回调被传递过来的函数,这就是我们说的回调函数
下面为一个演示函数,主函数中将函数指针传入中间函数,然后中间函数调用指向的函数
#include<stdio.h>
int callback_1(void) //回调函数1主体{ printf("call_1\n"); return 0;};
int callback_2(void) //回调函数2主体{ printf("call_2\n"); return 0;};
//定义一个处理函数,传入的是函数指针int Handle(int (*callback)(void)){ //回调函数 callback();}
int main(){ //定义两个函数指针来指向函数地址 //不定义也可以,因为函数名称本身就是函数入口地址 int (*call1)(void)=&callback_1; int (*call2)(void)=&callback_2;
Handle(call1); Handle(call2);
//改变函数指针指向 call1=&callback_2; Handle(call1); return 0;
}
运行结果