在 C 语言中,声明指向函数的指针是可以的。
函数也像其他的变量一样,是有它的地址的,因为函数的机器语言实现是由载入到内存中的代码组成。指向函数的指针中保存着函数代码起始处的地址。
函数指针的声明声明函数指针时必须声明它指向的函数的类型,即函数的返回类型以及函数的参数类型。
例如
void function(char*); //函数原型
int main()
{
void (*functionPointer)(char*);//函数指针
}
上述 code 2行就是声明了一个函数指针变量,变量名称是 functionPointer ,注意函数变量的括号,考虑到优。先级,这里的括号不能省略。
该声明的含义是,functionPointer 是一个指向函数的指针,它指向的函数返回值是 void ,它的参数列表是 char*。
函数指针的赋值有了函数指针之后,就可以把适当类型的函数的地址赋给它
在赋值时,函数的名称可以用来表示函数的地址
void function(char* c)
{
printf("%c",*c);
}
int main()
{
void (*functionPointer)(char*);
//这里的 function 是上文定义的函数的名称,在这个语句中可以用来表示函数的地址
functionPointer = function;
}
一定要注意在赋值时,函数的返回值与参数列表必须要符合指针声明时的类型,否则赋值会不合法。
#include函数指针的访问int sout(int a) { printf("%d",a); return 1; } int main() { int (*fp1)(); void (*fp2)(int); int (*fp3)(int) fp1=sout;//赋值不合法,参数类型不匹配 fp2=sout;//赋值不合法,返回值类型不匹配 fp3=sout;//赋值合法,参数类型和返回值匹配 }
指针函数的的访问有两种方式,不做赘述
show the code! #include指针函数作为参数int main() { void (*fp)(int); ... fp(3);//第一种方式,用指针名称来代替函数名称(实际上,在指针赋值的时候就是用函数名称来赋给指针名) (*fp)(3);//第二种方式,用 * 来取函数以调用(实际上,在定义指针的时候就是这样的格式) }
类似于其他变量类型用作参数时的格式,在参数处要指明参数的类型
#include//这个函数中,第二个参数就是一个返回值为 int 参数为 int 的一个函数(指针) void visit(a,int(*fp)(int)) { fp(a); }



