如何理解*main &main main(main为函数名)

zoudaokou2006 2008-03-28 06:42:41
int main(void)
{
printf("%x\n%x\n%x\n",
main,
&main,
*main);

return 0;
}
如上程序打印出的结果是
401005
401005
401005

请问如何理解main *main &main?

一个比较常见的说法是函数名main代表函数的入口地址。
以这个说法的话,main就是一个常量,r-value,感觉很难解释&main,*main(从字面上看是main指向的空间的值,而实际得到的是
main的字面值吧?)
同样,对char arr[10]可以有&arr == arr,这一点也不是很理解。

有说法是main也代表一个对象,可以对对象取地址,这是不是说上面几个不同的表达式要从不同的层面理解?

我感觉这方面应该是涉及到编译器如何理解这几个表达式的,大哥对这方面研究的很深,小弟请教一下,希望能得到你的帮助。
...全文
915 44 打赏 收藏 转发到动态 举报
写回复
用AI写文章
44 条回复
切换为时间正序
请发表友善的回复…
发表回复
pdjun 2008-09-24
  • 打赏
  • 举报
回复
有用处。
ascent2006 2008-03-31
  • 打赏
  • 举报
回复
学习了.
BluntBlade 2008-03-31
  • 打赏
  • 举报
回复
你们都把分抢完了才通知我呐……

函数名只是一个常量符号,代表函数的入口地址(编译期某些阶段才可见)。
对其求地址与对其解引用都视同求函数的入口地址,这一点可以在白皮书上确认。
不过呢,地址虽然相同但地址类型是不一样的,可以自己写下一些类型转换代码来检查这一点。

PS:数组名也有类似特性,地址相同但类型不一样。
meteora112 2008-03-31
  • 打赏
  • 举报
回复
[Quote=引用楼主 zoudaokou2006 的帖子:]
int main(void)
{
printf("%x\n%x\n%x\n",
main,
&main,
*main);

return 0;
}
如上程序打印出的结果是
401005
401005
401005
[/Quote]

main &main比较好理解都应该是相等的,*main也和前二者相等,能不能理解为函数名就是指向自己的指针呢?
pineapple_orz 2008-03-31
  • 打赏
  • 举报
回复
[Quote=引用 38 楼 bhdgx 的回复:]
数组名就是数组初始元素的地址
[/Quote]

貌似多维数组就不是了吧= =
yichuankun 2008-03-31
  • 打赏
  • 举报
回复
学习
Soulic 2008-03-31
  • 打赏
  • 举报
回复
数组名就是数组初始元素的地址
ake1988 2008-03-30
  • 打赏
  • 举报
回复
学习啦
独孤过儿 2008-03-30
  • 打赏
  • 举报
回复
[Quote=引用 35 楼 zoudaokou2006 的回复:]
各位哥哥都说的不错~!!!!
不过刀子哥哥还在睡觉啊。。。。。。。。。
[/Quote]
刀子现在忙着招金凤凰呢,哪有时间来回答问题啊...
lbc122 2008-03-30
  • 打赏
  • 举报
回复
都是强人....
zoudaokou2006 2008-03-30
  • 打赏
  • 举报
回复
各位哥哥都说的不错~!!!!
不过刀子哥哥还在睡觉啊。。。。。。。。。
waxl0118 2008-03-30
  • 打赏
  • 举报
回复
假装过来看看
lylymb 2008-03-30
  • 打赏
  • 举报
回复
谢谢各位朋友,今天我又学的知识了,也谢谢楼主啊!
winerluo 2008-03-30
  • 打赏
  • 举报
回复
不错,以前只是在表面猜想,
今天由高手将内部情况加以分析,
感觉有了更深的认识,谢啦!
stude 2008-03-30
  • 打赏
  • 举报
回复
go go study
pazi1985 2008-03-29
  • 打赏
  • 举报
回复
学习学习。
ttlyfast 2008-03-29
  • 打赏
  • 举报
回复
64位机?
tomotion 2008-03-29
  • 打赏
  • 举报
回复
不错,学习了点,偶正在学习C……
javabird1986 2008-03-29
  • 打赏
  • 举报
回复
汇编没学好,真难理解
野男孩 2008-03-29
  • 打赏
  • 举报
回复
函数名和变量名还是不一样的。从语义上来说,函数名和多维的数组名更相似,都是用来指示一个const指针,不能给它赋值。所以不管是main还是&main或者*main都是它的地址。就好像下面的数组地址:


#include <stdio.h>

int main(void)
{
int arr[10][10] = {0};

printf("%x\n%x\n%x\n",
arr,
&arr,
*arr);

return 0;
}

输出:
12fdf0
12fdf0
12fdf0
加载更多回复(24)

69,371

社区成员

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

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