函数
void func();/* 声明一个函数 */
返回值类型 函数标识符([形参列表]);
func是函数标识符,即函数名字,也是指向自己的指针,即函数指针。
C语言标准规定,函数指示符(function designator)既不是左值,也不是右值。但C++语言标准规定函数指示符属于左值,因此函数指示符转换为函数指针的右值属于左值转换为右值。
除了作为sizeof或取地址&的操作数,函数指示符在表达式中自动转换为函数指针类型右值。因此通过一个函数指针调用所指的函数,不需要在函数指针前加*运算符。(维基百科"函数指针")
func 等同 *func 等同 &func 为函数头地址
函数指针
void (* init)();/* 声明一个函数指针 */
返回值类型 ( * 指针变量名) ([形参列表]);
init为一个函数指针
“返回值类型”说明函数的返回类型,“(指针变量名 )”中的括号不能省,括号改变了运算符的优先级。若省略整体则成为一个函数说明,说明了一个返回的数据类型是指针的函数。后面的“形参列表”表示指针变量指向的函数所带的参数列表。
注意:声明一个函数指针变量必须和函数的 返回值类型 以及 参数类型 一致。函数指针类型根据两点决定,函数的 返回值类型 和 形参的类型;如void(*p)(void *) 与 void(*p)(),虽然p均为函数指针,不过因为形参不同,指向的函数是不同类型的。混用一般有warning
函数指针赋值,以下两者均可
init = func; //函数指针赋值
init = &func;// 函数指针赋值
例子 1:
void (* p)();/* 声明一个函数指针 */
无初始值则指向不确定,有函数名属性,此时 p = *p,
&p 则是存放 该指针值 的内存地址。
例子 2:
声明函数:
int abc(int a);//函数abc,返回类型int,形参int
int abcd(int *a);// 函数abc,返回类型int,形参int *
声明函数指针:
int (*p)(int);// 函数指针p,返回类型int,形参int
int (*pp)(int*);//函数指针pp,返回类型int,形参int *
此时
p可以指向int abc(int a);
pp可以指向int abcd(int *a);
赋值
p=abc;//p=&abc;亦可
pp=abcd;//pp=&abcd;亦可
代码中调用
*p()或p()
*ppp()或pp()
由于函数指针返回值类型格式相同,p=abc或者p=abcd 有时均可正常使用。可能会有warning
类型转换
void* 空指针类型,不同与void (*)()指针函数
可以定义 指针函数(注意区分 函数指针) 如 void *func(); 表示返回值是指针类型
(void *)用于强制转换为空指针类型
例子:
(void (*)(void *))
表示把一个值强制转换为函数指针类型,参数为空。
typedef使用
typedef void(*FunType)();
定义一种函数指针类型的格式,
Funtype p;
等同于 void(*p)();