社区
C语言 帖子详情 函数名本身就是这个函数的起始地址?为什么取函数名的地址后还是这个结果? drinker_linux 2009-06-25 10:23:15 #include
#include
#include
void test()
{
printf("123456\n");
}
int main(int argc, char *argv[])
{
printf("0x%x\n",test);
printf("0x%x\n",&test);
}
[root@localhost pht]# ./a.out
0x8048328
0x8048328
我非常的困域
这两个printf的结果怎么会一样呢?求大侠解答
printf("0x%x\n",test);
printf("0x%x\n",&test);
...全文
934 9 打赏 收藏 函数名本身就是这个函数的起始地址?为什么取函数名的地址后还是这个结果? #include #include #include void test() { printf("123456\n"); } int main(int argc, char *argv[]) { printf("0x%x\n",test); printf("0x%x\n",&test); } [root@localhost pht]# ./a.out 0x8048328 0x8048328 我非常的困域 这两个printf的结果怎么 复制链接
扫一扫 分享 转发到动态 举报 AI 作业
写回复 配置赞助广告取 消
确 定
用AI写文章 9 条回复 切换为时间正序 请发表友善的回复… 发表回复 打赏红包 需支付: 0.00 元 取 消 确 定 青岛芒果 2009-06-25 打赏举报 回复 函数名跟数组名一样,都是表示地址常量的。所以func, &func都是一回事。本来不该写成&func的形式。 drinker_linux 2009-06-25 打赏举报 回复 多谢各位的指点,在下略懂一二了。谢谢 a_p_z 2009-06-25 打赏举报 回复 C++ primer关于函数指针那章曾经写过
func 和 &func 其实是一回事
历史问题,习惯问题,写法问题,兼容问题
其实自己动脑想想,函数只存在入口地址概念,本身无取值的概念
飞天御剑流 2009-06-25 打赏举报 回复 [Quote=引用楼主 drinker_linux 的帖子:]
#include
#include
#include
void test()
{
printf("123456\n");
}
int main(int argc, char *argv[])
{
printf("0x%x\n",test);
printf("0x%x\n",&test);
}
[root@localhost pht]# ./a.out
0x8048328
0x8048328
我非常的困域
这两个printf的结果怎么会一样呢?求大侠解答
printf("0x%x\n",test);
printf("0x%x\n",&test);
[/Quote]
按照&运算符本来的意义,它要求其操作数是一个对象,但函数名不是对象(函数是一个对象),本来&test是非法的,但很久以前有些编译器已经允许这样做,c/c++标准的制定者出于对象的概念已经有所发展的缘故,也承认了&test的合法性。
因此,对于test和&test你应该这样理解,test是函数的首地址,它的类型是void (),&test表示一个指向函数test这个对象的地址,它的类型是void (*)(),因此test和&test所代表的地址值是一样的,但类型不一样。test是一个函数,&test表达式的值是一个指针!
跟此问题类似的还有对一个数组名取地址。
标准在其rationale中解释了这个问题,摘录如下:
6.5.3.2 Address and indirection operators
Some implementations have not allowed the & operator to be applied to an array or a function.
(The construct was permitted in early versions of C, then later made optional.) The C89 Language
Committee endorsed the construct since it is unambiguous, and since data abstraction is
enhanced by allowing the important & operator to apply uniformly to any addressable entity. localxiao 2009-06-25 打赏举报 回复 参考指针和数组名的区别 drinker_linux 2009-06-25 打赏举报 回复 请问意义有何不同? nlylidb 2009-06-25 打赏举报 回复 内容相同不代表意义相同
#include
int main(void)
{
int a[10];
printf("%p\n", a);
printf("%p\n", &a);
return 0;
} foxyz123 2009-06-25 打赏举报 回复 函数名并不能等同于指针,如果是指针,
p代表其所指向的首地址
&p表示保存指针变量的地址
函数名在使用上是和指针等同,但其并非是一个真正的指针,就象数组名一样一样的,所以你用test和&test所指向的地址是一样的,都是数据的首地址 【C】函数指针——函数名等于函数的地址 #include
int square(int num){
return num * num;
}
int main(){
int num;
int (*fp)(int);
printf("please input a number:");
scanf("%d",&num);
//“如果在程序中定义了一个函数,在编译时会把函数的源代码转换为可执行代码并分配一段存储空间。
// 这段内存空间有一个起始地址,也称为函 通过函数名调用函数和通过函数指针调用函数有什么区别呢?为什么调用函数指针没有直接调用函数效率高?
1.通过函数名调用函数和通过函数指针调用函数有什么区别呢?
首先函数名、函数指针都表示代码段的起始地址。
1)调用函数的时候必须指定函数名,可是当有时候不确定具体调用哪个函数,当某些事件发生后才确定,所以事先就定义一个函数指针(比如回调函数)
2)函数的调用有函数栈桢的开辟。
3)函数指针不会处理成内联函数
2.为什么调用函数指针没有直接调用函数效率高?
C语言基础(三):函数名、函数指针、指针函数的理解 函数的理解
函数名的理解--函数指针
函数名也称为函数的指针,所以c语言中函数名就是一个指针。
函数指针 两种表示:
int func(char,double); // 这是一个普通函数
int (*p)(char,double); //指向一个以上函数的指针
函数指针:指针,指向的类型是一个函数
int add(int a,int b)
{
return a + b;
}
//指针变量,指向add函数
//int (int a,int )(*p);
int (*p)(int a... 通过函数名调用函数和通过函数指针调用函数有什么区别? 1.通过函数名调用函数和通过函数指针调用函数有什么区别呢?
首先函数名、函数指针都表示代码段的起始地址。
1)调用函数的时候必须指定函数名,可是当有时候不确定具体调用哪个函数,当某些事件发生后才确定,所以事先就定义一个函数指针(比如回调函数)
2)函数的调用有函数栈桢的开辟。
3)函数指针不会处理成内联函数
2.为什么调用函数指针没有直接调用函数效率高?
1)会产生野指针(这是安全,不... c程序如何根据地址获取函数名(addr2line) 38.1 前言
之前有做过一个通过截取内核信号,获取程序出错所在函数位置信息(如段错误),然后进行栈回溯的功能(之前的blog有写),那个虽然成功了,但仍有一些不合人意的地方。就是手动回溯结果显示的只是函数地址,如果要看是哪个函数,那还要用objdump或addrline工具用地址找到是哪个函数,比较麻烦。最近折腾了两天时间,终于搞定了根据地址自动获取函数名称的功能。
不管gdb还readelf或addrline工具,可以简单轻松的敲一下命令就可以把函数名及地址整齐地打印展现出来,那么它们是怎么实现的呢??
C语言
70,022
社区成员
243,263
社区内容
发帖 与我相关 我的任务 C语言 C语言相关问题讨论 复制链接
扫一扫 分享 确定 社区描述 C语言相关问题讨论 社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告 试试用AI创作助手写篇文章吧
+ 用AI写文章