这两个问题以前讨论的时候也提及过。函数指针在回调的时候经常会用到。
int fun2()
{
printf("I am fun2\n");
return 10;
}
int fun3(int ar)
{
printf("I am fun3:参数ar=%d\n",ar);
return ar;
}
int main()
{
printf("%x\n",&fun1);
//定义函数指针
void (*p1)();
int (*p2)();
int (*p3)(int);
//给函数指针赋值
p1=&fun1;
p2=&fun2;
p3=&fun3;
//调用函数指针
(*p1)();
int n=(*p2)();
int m=(*p3)(10);
return 0;
}
不知楼上所说的加载指的是链接还是装入?
我认为首先编译后生成的目标文件.o中的地址和静态链接库.a及动态链接库.so的地址应该归为一类。
然后还要考虑目标文件和静态链接库链接后可执行文件中的地址。
最后是装入内存以后的实际地址。
可能是为了向前兼容所以显示的用*运算符依旧被支持。
On 12月10日, 下午6时45分, 常高伟 <chgao...@gmail.com> wrote:
> 谁解释一下,为什么p2();和(*p2)();的效果一样,都是调用函数?
>
> 2009/12/10 常高伟 <chgao...@gmail.com>
>
>
>
> > fronterz说的比较详细。补充一点:
> > 1、函数指针的赋值,还有一种方式:
> > p1=fun1;
>
> > 2、通过指针调用函数,也有另外一种方式:
> > int n=p2();
>
> > 2009/12/10 fronterz <xiao_mingp...@163.com>
> >> }- 隐藏被引用文字 -
>
> - 显示引用的文字 -
int main()
{
int (*p)();
p = fun;
}
函数名称本身就是一个地址,fun和&fun是一回事。
印象中,c语言里面函数指针是特殊处理的,调用函数时,p()和(*p)(),甚至(******p)()是一回事。