免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4528 | 回复: 8
打印 上一主题 下一主题

请问 func() 和 (*func)()的区别 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-04-19 13:09 |只看该作者 |倒序浏览
下面几行简单的程序 请问func() 和(*func)()
有什么不同么?

#include <stdio.h>

void func()
{
        printf("Ok\n");
}

int main()
{
        func();
        (*func)();
        return 0;
}

论坛徽章:
0
2 [报告]
发表于 2007-04-19 13:15 |只看该作者
在这里,两个一样

论坛徽章:
0
3 [报告]
发表于 2007-04-19 13:20 |只看该作者
原帖由 high21 于 2007-4-19 13:09 发表
下面几行简单的程序 请问func() 和(*func)()
有什么不同么?

#include <stdio.h>

void func()
{
        printf("Ok\n");
}

int main()
{
        func();
        (*func)();
        return 0;
}


要说区别。(*func)();才是函数指针使用的正确形式。早期c语言不支持func();

论坛徽章:
0
4 [报告]
发表于 2007-04-19 13:22 |只看该作者
恩 汇编看了看 func *func的地址是一样的
不过感觉 *func 好像是把函数取出来的味道

嵌入式中reset时跳转到 0x000000 用的是(*((void (*)(void))0x00000000))();
好像((void (*)(void))0x00000000)();也是对的吧 那么去掉一个*是不是少了一步操作呢?

论坛徽章:
0
5 [报告]
发表于 2007-04-19 13:24 |只看该作者
(*func)();

相对更加显示的高速系统,这是一个函数调用


似乎是这样


没有看过相关的权威资料

PS,汇编也不会

论坛徽章:
0
6 [报告]
发表于 2007-04-19 13:25 |只看该作者
如果是zx_wing 说的那样 早期c语言不支持func(); 还是很好理解的。

论坛徽章:
0
7 [报告]
发表于 2007-04-19 14:25 |只看该作者
这里最关键的是*运算符的意义
func();
一般是被编译成call  func的地址;这里是个立即寻址方式
(*func)();这种方式真的不多见;
一般是先定义一个funa=func;
然后在 (*funa)();
这里取得函数的地址可以用间接寻址方式。
对于指针个人理解是(*p)就是等同于p指向的变量,当做左值时就是取得p指向的变量的地址,做右值就是p指向的变量的值,而这里*p相当于左值
func();
(*func)();
就有等价的效果;
同样
(*((void (*)(void))0x00000000))();
((void (*)(void))0x00000000)();
也应该是等价的。

[ 本帖最后由 epegasus 于 2007-4-19 14:45 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2007-04-19 14:48 |只看该作者

论坛徽章:
0
9 [报告]
发表于 2007-04-19 15:19 |只看该作者
非常感谢 受益匪浅
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP