请教下函数指针的地址和调用问题??

sno_guo 2013-09-15 06:05:48
代码如下:
#include <stdio.h>
#include <stdlib.h>

void (*funP)(int);
void myFun(int x)
{
printf("myFun: %d\n",x);
}
int main()
{
//一般的函数调用
myFun(100);

//myFun与funP的类型关系类似于int 与int *的关系。
funP=&myFun; //<-----------取地址赋值
(*funP)(2003);


funP=myFun;///<-------直接把变量赋值 ????? 这里为什么也可以?????
funP(300);
printf("myFun\t 0x%p=0x%p\n",&myFun,myFun); ////????取地址竟然和 取变量竟然一样??????
return 0;
}




我的困惑是 函数指针地址竟然和函数指针的变量是同一个,请问下为什么这样,编译器在其中做了什么,谢谢!
...全文
140 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
sno_guo 2013-09-15
  • 打赏
  • 举报
回复
哦,谢谢,谢谢,原来这样。 呵呵,感谢!
  • 打赏
  • 举报
回复
&myFun,取地址符号是可选的,却是推荐使用的,毕竟这样做,就能和其它取地址的方式做到逻辑上的一致
  • 打赏
  • 举报
回复
引用 2 楼 sno_guo 的回复:
哦,谢谢回复。 通常来讲,我对一个变量 取地址和取值是不一样的,这里为什么一样。 我的困惑是为什么一样,呵呵。
编译器把这两种写法同等看待,我们又何必纠结于这个问题呢,编译链接完成之后,生成的代码中,这两个不同的写法,都会相同的函数地址来替换,就这么简单. 代码说明一切!

00411455  call        @ILT+300(__RTC_CheckEsp) (411131h)  
    printf("myFun\t 0x%p=0x%p\n",&myFun,myFun);  ////????取地址竟然和 取变量竟然一样??????
0041145A  mov         esi,esp  
0041145C  push        offset myFun (411050h)  //是不是一样的,没区别吧??
00411461  push        offset myFun (411050h)  
00411466  push        offset string "myFun\t 0x%p=0x%p\n" (41574Ch)  
sno_guo 2013-09-15
  • 打赏
  • 举报
回复
哦,谢谢回复。 通常来讲,我对一个变量 取地址和取值是不一样的,这里为什么一样。 我的困惑是为什么一样,呵呵。
图灵狗 2013-09-15
  • 打赏
  • 举报
回复
&myFun和myFun是一回事,不过推荐的写法是funP=myFun
引用 楼主 sno_guo 的回复:
代码如下:
#include <stdio.h>
#include <stdlib.h>

void (*funP)(int);   
void myFun(int x)
{
    printf("myFun: %d\n",x);
}
int main()
{
    //一般的函数调用
    myFun(100);

    //myFun与funP的类型关系类似于int 与int *的关系。
    funP=&myFun;  //<-----------取地址赋值 
    (*funP)(2003); 

 
    funP=myFun;///<-------直接把变量赋值  ?????  这里为什么也可以????? 
    funP(300);
    printf("myFun\t 0x%p=0x%p\n",&myFun,myFun);  ////????取地址竟然和 取变量竟然一样??????
    return 0;
}


我的困惑是 函数指针地址竟然和函数指针的变量是同一个,请问下为什么这样,编译器在其中做了什么,谢谢!

69,370

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧