函数指针
此文主要针对编译器对函数名的隐式转换举例说明。
#include <stdio.h> #include <stdlib.h> void func(int a) { printf("xxxxxa=%d\n", a); } int main (int argc, char **argv) { void (* f1)(int )=func; printf("f1=%p\n", f1);//f1=0x804857d void (* f2)(int a)=&func;//f2=0x804857d printf("f2=%p\n", f2); //初始化表达式中&操作符是可选的,因为函数名被使用时总是由编译器将其转换为函数指针
//&操作符只是显示地说明了编译器将隐式执行的任务
func(10);//简单使用名字调用函数func,函数名func首先被转换为一个函数指针,该指针指定函数在内存中的位置,然后,函数调用操作符调用该函数,执行开始于这个地址的代码。 f1(1);//函数指针通常用法 (*f2)(2);//对f2执行间接访问操作,他把函数指针转换为一个函数名,但这个转换并不是真正需要的,因为编译器在执行函数调用操作符之前又会把它转换回去 //以上三条语句的指定效果是一样的. return 0; }
综上所述:
函数指针初始化时,是否带&操作符,效果一样。
函数指针使用时,是否使用间接访问操作(*),效果一样。