提示: 作者被禁止或删除 内容自动屏蔽
哎,我的考虑不周全。
函数指针是有类型的。
理由:
我原先说函数指针是没类型的,当时我是这么想的:
在C语言中规定,一个函数总是占用一段连续的内存区, 而函数名就是该函数所占内存区的首地址。 我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量, 使该指针变量指向该函数。然后通过指针变量就可以找到并调用这个函数。
所以我想,既然都是指向内存的某个地址,而且存放的格式也完全一样,那么什么指针不都一样都能指向那块地方?
然而我却漏了个非常重要的元素没有考虑,那就是这个函数的返回值。返回值的类型决定了函数的类型。
看看下面的程序,在GCC4.0下没有任何的警告。
#include "stdio.h"
int add(int a, int b){
return a+b;
}
void showAdd(int a, int b){
printf("result = %d\n",a+b);
}
int main(void){
int (*point)(),result;
point = add;
result = (*point)(1,2);
printf("result = %d\n",result);
return 0;
}
我们可以看到,我们把(*point)()和result均定义为int类型的变量,其中point是int类型的指针变量。如果说point指针是无类型的,那么我们可以顺利的把point重定位指向showAdd这个函数。我们看看
#include "stdio.h"
int add(int a, int b){
return a+b;
}
void showAdd(int a, int b){
printf("result = %d\n",a+b);
}
int main(void){
int (*point)(),result;
point = showAdd;
(*point)(1,2);
return 0;
}
编译结果:
[vlinux@localhost ~]$ gcc -o test test.c
test.c: 在函数 ‘main’ 中:
test.c:13: 警告:从不兼容的指针类型赋值
很遗憾,竟然在point = showAdd;这句出现了指针类型赋值警告:不兼容的指针类型赋值,呵呵