函数指针
- 函数指针的实质还是指针,是一个指针变量,本身占据四个字节(在32位系统中,指针变量都是4个字节)。
- 函数指针,数组指针,普通指针之间并没有本质区别,区别在于指针指向的内容是什么。
- 函数的实质是一段代码,这段代码在内存中是连续分布的(一个函数的大括号括起来的所有语句将来编译出来生成的可执行程序是连续的)。对于函数来说,很关键的是函数中第一句代码的地址,这个地址就是函数地址,在c语言中使用函数名表示。
- 函数指针就是一个普通变量,类型为函数指针类型,其内部的值就是某个函数的地址(也就是函数的函数名这个符号在编译器中对应的值)
函数指针的书写
假设有一个函数为: void func(void);
其对应的函数指针为: void (*p)(void);
函数指针在定义时,返回值和形参必须和该函数指针对应的函数的返回值和形参相同。
#include <stdio.h>
void Func(void);
typedef void (*Func_p)(void);
int main(void)
{
Func_p p;
p = Func;
p();
(*p)();
return 0;
}
void Func(void)
{
printf("函数指针测试\n");
}
运行结果
两种引用方式都是可以的。
给函数指针赋值时,p = func;即可
引用时,可以写成 p();或者 (*p)();然后就会运行void func(void);函数中的内容。
函数名和数组名
函数名不像数组名,数组名在做右值时,加&和不加&有不同的意义,加&表示是数组的地址,不加&表示是数组首元素首地址。而函数名不同,函数名不论是否加&,函数名的意义都是不变的。都表示为函数的地址。
一个复杂指针实例:
char* strcpy(char *dest , const char *src);
对应的函数指针:
char* (*p)(char *dest , const char *src);
typedef关键字的用法
- typedef是c语言中一个关键字,作用是用来做定义(或者叫重命名类型)
- c语言中的类型一共有两种:一种是编译器定义的原生类型(基础数据类型,如int,double之类)第二种是用户自定义的类型,不是语言自带的,而实程序员自己定义的(如数组类型,结构体类型,函数类型。。)
- 数组指针,指针数组,函数指针等都属于用户字定义类型。
- 有时候字定义类型名字太长了,用起来不方便,所以用typedef给他重命名一个短一点的名字。
注意:typedef是类型重命名,也就是说typedef加工出来的都是类型,不是变量。
定义方法:
typedef char* (*ptype)(char *dest , const char *src); //声明
ptype P1; //定义一个函数指针变量。
P1(…); //给P1赋值后,引用