您的位置:首页 > 其它

关于函数名和函数指针的理解

2011-10-01 17:25 218 查看
最近看了一点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在这里应该是个回调函数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: