关于函数本身以及函数的地址

沭水河畔 2010-08-08 10:43:01

#include <stdio.h>

void function()
{
puts("Call function.");
}

int main(int argc, char* argv[])
{
void (*p)();
int a=325;
int *pa=&a;
p=function;
/* p=&function; */
(*p)();
printf("%d %d\n%d %d\n",function,&function,pa,&pa);
return 0;
}

结果:
Call function.
4198405 4198405
1310584 1310580
上面的代码中有几处不明白的地方,首先函数名function代表函数的入口地址,那么&function也代表函数的入口地址?
其次,pa为什么比&pa要大呢?a可是比pa先生成的啊?
...全文
120 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lovestefanie 2010-08-09
  • 打赏
  • 举报
回复
学习了
cattycat 2010-08-08
  • 打赏
  • 举报
回复
对全局的函数来说,function和&function都是函数地址。
pa是指针的值,&pa是存放指针的地址。栈是由高址向低址增长的。
Csuxiaowu 2010-08-08
  • 打赏
  • 举报
回复
一般都是高位先存的
liuwei2500 2010-08-08
  • 打赏
  • 举报
回复
以下的回答不知道对不对
我以前是学C#的,函数,结构体,string类型属于引用类型,说白了就是由于以上几个东西可能占有的空间会比较大,通常实例化的时候变量就相当于指针指向了函数的头地址【节省内存开销】,你所说的function其实就是相当于指针指向function,至于&function也是指着指向的function。
指针指向引用类型的时候,指针的内存地址就是函数的头地址(没有重新给指针分配内存)
pa指针指向的是值类型,那么会在内存上给pa分配一个内存地址,&pa其实就是a,地址也就是a的内存地址。
当然你可以将a的地址打印出来看看,我的这个推测是否正确。
Csuxiaowu 2010-08-08
  • 打赏
  • 举报
回复
printf("%d %d\n%d %d\n",function,&function,pa,&pa);
你这里用的是pa好不好
先是pa,它指向的是a,这个地址是1310584
然后&pa,这就是指针自己的地址空间 不正好4字节嘛
pengzhixi 2010-08-08
  • 打赏
  • 举报
回复
是的,function和&function都是输入函数的地址

那说明“栈”的地址是从高到低伸展的

69,369

社区成员

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

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