函数指针作用:函数指针有两个用途:
(1)调用函数;(2)做函数的参数.
下面介绍一下用【函数指针】来调用strcpy函数,并分析其中的三个疑问。
char a[5] = {0};
char* (*pFunc)(char*, const char*); //因为strcpy是一个指针,故要用(*pFunc)
//char *pFunc(char*, const char*); //这样写是指针函数了;不是函数指针pFunc = strcpy; //函数指针赋值
pFunc(a, "abc"); //通过函数指针pFunc调用strcpy函数
printf("a = %s.\n", a);
问题一:定义函数指针是为什么要用char* (*pFunc)(char*, const char*);而不能用char *pFunc(char*, const char*);?
解答:如果用char *pFunc(char*, const char*);编译器会报错:error: lvalue required as left operand of assignment(pFunc = strcpy;)。意思是pFunc = strcpy;等式的左边是一个函数名,函数名实质是一个地址,这个地址在编译器编译开始之前就已经确定了,在编译过程中不会改变。所以说pFunc是一个常量,不能做左值)
问题二:char* (*pFunc)(char*, const char*);而不能用char *pFunc(char*, const char*);的区别在(*pFunc),为什么要加括号()?
解答:用man3手册查看strcpy函数的函数声明,可以看到strcpy的声明为char *strcpy(char *dest, const char *src);因为strcpy是一个指针,故要用(*pFunc),加一个()让pFunc先转为指针类型。
为了便于理解,【注意】char*与char *的区别,这里定义函数指针的语句,
一般写成:char* (*pFunc)(char*, const char*);
而不写成:char *(*pFunc)(char*, const char*);
问题三:怎么分析 char *(*pFunc)(char*, const char*); 是定义了函数指针?
解答:核心是pFunc,先与*结合,说明是一个指针,然后右边跟()结合,说明是一个函数,函数形参列表是char*, const char*,返回值是char*类型