【讨论】【函数】讨论一下函数的地址,以及函数指针。

4 views
Skip to first unread message

常高伟

unread,
Dec 9, 2009, 8:58:02 AM12/9/09
to DS计划——C深入学习项目
讨论两个问题:
1、 如何查看函数在内存中的地址?如何给一个函数指针赋值?
2、 如何通过函数指针调用函数。

这两个问题以前讨论的时候也提及过。函数指针在回调的时候经常会用到。

faked faked

unread,
Dec 9, 2009, 8:50:40 PM12/9/09
to ds-c-i...@googlegroups.com
被加载前的还是被加载后的地址?

2009/12/9 常高伟 <chga...@gmail.com>:

--
- Faked

Hidinck Cui

unread,
Dec 9, 2009, 10:54:20 PM12/9/09
to ds-c-i...@googlegroups.com

看函数地址
 
我非常晕....
 
比如存在函数fun. 那么fun的值和&fun的值是一样的,当然意义可能不同,但是那个才是真正的函数的地址,以及他们的含义分别是什么。
 
迷茫中。
2009/12/10 faked faked <faked.fa...@gmail.com>

常高伟

unread,
Dec 9, 2009, 11:44:43 PM12/9/09
to ds-c-i...@googlegroups.com
被加载前的还是被加载后的地址?

加载前和加载后有区别吗?能否解答一下?

2009/12/10 Hidinck Cui <hid...@gmail.com>

Icywind HE

unread,
Dec 10, 2009, 12:53:56 AM12/10/09
to ds-c-i...@googlegroups.com
不知楼上所说的加载指的是链接还是装入?

我认为首先编译后生成的目标文件.o中的地址和静态链接库.a及动态链接库.so的地址应该归为一类。

然后还要考虑目标文件和静态链接库链接后可执行文件中的地址。

最后是装入内存以后的实际地址。


fronterz

unread,
Dec 10, 2009, 3:20:44 AM12/10/09
to DS计划——C深入学习项目
1查看函数地址,那可以直接输出地址
2给函数指针赋值,那首先要定义一个指向函数函数的指针,指向什么样的函数(返回值什么,参数多少和类型等),然后再具体赋值
3调用使用函数指针代替函数名来调用即可
不知道下面算是不
void fun1()
{
printf("I am fun1\n");
}

int fun2()
{
printf("I am fun2\n");
return 10;
}
int fun3(int ar)
{
printf("I am fun3:参数ar=%d\n",ar);
return ar;
}
int main()
{
printf("%x\n",&fun1);
//定义函数指针
void (*p1)();
int (*p2)();
int (*p3)(int);
//给函数指针赋值
p1=&fun1;
p2=&fun2;
p3=&fun3;
//调用函数指针
(*p1)();
int n=(*p2)();
int m=(*p3)(10);
return 0;
}

常高伟

unread,
Dec 10, 2009, 4:58:09 AM12/10/09
to ds-c-i...@googlegroups.com
开发中经常用的的是可执行文件装入内存后的地址。转入内存之前,是保存在磁盘中的。

2009/12/10 Icywind HE <icyw...@gmail.com>
不知楼上所说的加载指的是链接还是装入?

我认为首先编译后生成的目标文件.o中的地址和静态链接库.a及动态链接库.so的地址应该归为一类。

然后还要考虑目标文件和静态链接库链接后可执行文件中的地址。

最后是装入内存以后的实际地址。



常高伟

unread,
Dec 10, 2009, 5:12:02 AM12/10/09
to ds-c-i...@googlegroups.com

fronterz说的比较详细。

补充一点:
1、函数指针的赋值,还有一种方式:
    p1=fun1;

2、通过指针调用函数,也有另外一种方式:
   int n=p2();

2009/12/10 fronterz <xiao_m...@163.com>

常高伟

unread,
Dec 10, 2009, 5:45:07 AM12/10/09
to ds-c-i...@googlegroups.com
谁解释一下,为什么p2();和(*p2)();的效果一样,都是调用函数?

2009/12/10 常高伟 <chga...@gmail.com>

C语言小学生

unread,
Dec 10, 2009, 6:19:59 AM12/10/09
to DS计划——C深入学习项目
《The C Programming Language》变更小结,P238上说:指向函数的指针可以作为函数的标识符,而不需要显示的*运算符。

可能是为了向前兼容所以显示的用*运算符依旧被支持。

On 12月10日, 下午6时45分, 常高伟 <chgao...@gmail.com> wrote:
> 谁解释一下,为什么p2();和(*p2)();的效果一样,都是调用函数?
>

> 2009/12/10 常高伟 <chgao...@gmail.com>


>
>
>
> > fronterz说的比较详细。补充一点:
> > 1、函数指针的赋值,还有一种方式:
> > p1=fun1;
>
> > 2、通过指针调用函数,也有另外一种方式:
> > int n=p2();
>

> > 2009/12/10 fronterz <xiao_mingp...@163.com>

> >> }- 隐藏被引用文字 -
>
> - 显示引用的文字 -

常高伟

unread,
Dec 10, 2009, 6:28:05 AM12/10/09
to ds-c-i...@googlegroups.com
结果是这样,但是内部实现,不知道怎么回事。

2009/12/10 C语言小学生 <hid...@gmail.com>

Icywind HE

unread,
Dec 10, 2009, 9:03:40 AM12/10/09
to ds-c-i...@googlegroups.com
内部实现从编译原理的角度来说就是当编译器识别了

(*p)()这样形式的序列时会和p()这样的序列同样处理,

应该说是两个不同的语法树对应一种翻译。

再往下深究就要看编译器的源代码了。

Sorehead

unread,
Dec 21, 2009, 12:43:44 AM12/21/09
to DS计划——C深入学习项目
int fun()
{
return 0;
}

int main()
{
int (*p)();

p = fun;
}

函数名称本身就是一个地址,fun和&fun是一回事。
印象中,c语言里面函数指针是特殊处理的,调用函数时,p()和(*p)(),甚至(******p)()是一回事。

林跃东

unread,
Dec 21, 2009, 3:40:38 AM12/21/09
to ds-c-i...@googlegroups.com
函数名称本身就是一个地址,fun和&fun是一回事
 
我觉得这句话有问题,不是很对,就像一个数组int a[10],a是数组名,同时也是一个地址,那是不是a和&a就是一样?
显然这两个意义上不同

2009/12/21 Sorehead <Sore...@263.net>
Reply all
Reply to author
Forward
0 new messages