最近看了一点C基础的内容,对于函数名有点不理解:
/* my_func.h */
#ifndef MY_FUNC_H
#define MY_FUNC_H
void print_score(char, int(*visit)(char));
#endif
/* my_func.c */
#include <stdio.h>
#include "my_func.h"
void print_score(char score, int(*visit)(char)) {
printf("the score is %d\n",(*visit)(score));
}
在主函数中,根据传入的score打印出相应的分数值。
#include "my_func.h"
int get_score(char ch)
{
int score = 0;
switch(ch) {
case 'a':
score = 100;
break;
case 'b':
score = 80;
break;
case 'c':
score = 60;
break;
case 'd':
score = 0;
break;
default:
score = -1;
}
return score;
}
int main(void) {
print_score('b', &get_score);
return 0;
}
print_score('b', &get_score);
get_score这个函数地址,作为参数被传入到print_score, 而在print_score函数中用int(*visit)(char)接收传入的参数。
visit在这里是表示一个函数指针变量,可以看出这个指针指向的应该是一个参数为char,返回值为int的函数,那么在main函数中把get_score这个函数地址作为参数传入是正确的,因为它符合参数列表为char, 返回值为int的要求,同时表明函数名get_score是这个函数的入口地址变量。
但是更多的时候,作这样的调用:
print_score('b', get_score)
这种调用方式也是正确的,那么以上两种方式该如何统一呢?也就是函数名到底是什么呢?
请教了别人,得出的结论是:函数名指的是代表函数实体的标识符,类型是函数类型,不是函数指针类型,而在表达式中放入标识符需要数值化,C和C++都规定函数到指针的转换,除少数情况外,表达式中的函数指示符会隐式转换成指向函数首地址的函数指针, 而&符仍然遵循它的取地址操作的语法
这样上面两种表达方式就统一了,get_score在这里应该是个回调函数。