| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 689 人关注过本帖
标题:[貌似已解决]关于函数指针的2个问题,请帮帮忙.谢谢
取消只看楼主 加入收藏
casio1374633
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2010-3-11
收藏
 问题点数:0 回复次数:2 
[貌似已解决]关于函数指针的2个问题,请帮帮忙.谢谢
第一个:
===============================
请帮忙看下这个函数的指针如何理解?谢谢
------------------------------------------------------
#include <stdio.h>
#include <string.h>
void        tell_me(int f(const char *, const char *));
int main(void)
{
        tell_me(strcmp);
        tell_me(main);
        return 0;
}
void        tell_me(int f(const char *, const char *))
{
        if (f == strcmp)  /* <-----我不理解这里*/
                printf("Address of strcmp(): %p\n", f);
        else
                printf("Function address: %p\n", f);
}
--------------------------------------------------------------
其中我不理解的是,这个程序表达的应该是说f是一个指向函数的指针,判断的时候是判断f是否指向函数strcmp,如果是的话,就输出strcmp这个函数的地址.如果不是,就输出main函数的地址
因为函数名可以作为指针,所以if (f == strcmp)应该是说判断2个指针的地址是否相同对吧?
我用gdb 断点到此,print f和printfstrcmp得到的是不同的地址啊,并且可以发现f和*f的内容居然一样,strcmp和*strcmp也一样,请问是什么原因,如何解释?
(gdb) print f
$1 = (int (*)(const char *, const char *)) 0x8048310 <strcmp@plt>
(gdb) print strcmp
$2 = {<text variable, no debug info>} 0xb7e59d20 <strcmp>
(gdb) n
16                        printf("Address of strcmp(): %p\n", f);
(gdb) print strcmp
$3 = {<text variable, no debug info>} 0xb7e59d20 <strcmp>
(gdb) print *strcmp
$4 = {<text variable, no debug info>} 0xb7e59d20 <strcmp>
(gdb) print *f
$5 = {int (const char *, const char *)} 0x8048310 <strcmp@plt>
(gdb) n
Address of strcmp(): 0x8048310
19        }
(gdb) n
后来我查到plt是指的过程链接表,是不是说只有在执行到f == strcmp时候,才把f的地址和strcmp的位置指向同一位置?

===========================================================
第二个:
------------------------------------------------------------------------------
字符串在函数调用过程中的输出,请帮忙看下.请帮忙看下,为什么出错?
-----------------------------------------------------------------------------------------
#include <stdio.h>
#include <string.h>
int main(void)
{
        char        p1[20] = "abc", *p2 = "pacific sea";
        printf("%s        %s         %s\n", p1, p2, strcat(p1, p2));  /*<-----问题出在这里*/
        return 0;
}
--------------------------------------------------------------------------------------------------------------
输出我的认为应该是先输出p1, p2以后再执行strcat. 但是实际输出的情况:
abcpacific sea        pacific sea         abcpacific sea
可以发现strcat先于p1执行,改变了p1的内容,请问这个内部是怎么的顺序?难道printf不是顺序执行的?

谢谢各位


[ 本帖最后由 casio1374633 于 2010-3-13 15:41 编辑 ]
搜索更多相关主题的帖子: 指针 函数 
2010-03-13 12:47
casio1374633
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2010-3-11
收藏
得分:0 
谢谢楼上几位,反汇编来得真直接.一下子就搞清楚了~~~谢谢了~~关于第二个问题的解答,我更倾向于4#的回答~~

谢谢楼上的各位.受教了

====================
各位都在啊,编辑的功夫又看到回帖了,看来都在奇怪这个部分,


[ 本帖最后由 casio1374633 于 2010-3-13 15:42 编辑 ]

静下心来,做点实事
2010-03-13 15:38
casio1374633
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2010-3-11
收藏
得分:0 
关于函数指针,还有个更奇怪的例子,如果各位有兴趣,帮忙看看这个:

#include <stdio.h>
void   f(void);
void   g(void);
void   h(void);
int main(void)
{
   (*f)();
   return 0;
}
void f(void)
{
   printf("Hello from f().\n");
   (((*g)))();
}
void g(void)
{
   printf("Hello from g().\n");
   (*(*(*h)))();  /*<---------谁能解释下?------*/
}
void h(void)
{
   printf("Hello from h().\n");
}

所指的那行,我自己测试过:使用h(), (*h), (*(*h)),(*(*(*h))),都可以.而且gdb观察都是同一个地址,各位能帮忙解释下吗?

静下心来,做点实事
2010-03-13 15:46
快速回复:[貌似已解决]关于函数指针的2个问题,请帮帮忙.谢谢
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017575 second(s), 8 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved