您的位置:首页 > 编程语言 > C语言/C++

关于c++ 函数指针的问题

2008-02-26 20:00 507 查看
写了一个测试函数测试了一下: 
#include <stdio.h>

void abc(){
printf("abc/n");
}

void kkk(){
printf("ddd/n");
}

void (*fun)();

int main(){
abc();
(&abc)();
(*abc)();
(*(*(*(*abc)))) ();

printf("++++++ /n");

(*(*(*(*(*abc)))))();

(*(*(*(*(*(*abc))))))();

printf("++++++ /n");
kkk();

fun = kkk;

printf("before kkk /n");
(*fun)();

fun = abc;

printf("before abc /n");
(*fun)();

printf("%x, %x, %x, %x, %x/n", kkk, &kkk, *kkk, **kkk, ***kkk);
printf("%x, %x, %x/n", &fun, *fun, fun);

return 1;
}

结果如下:
abc
abc
abc
abc
++++++
abc
abc
++++++
ddd
before kkk
ddd
before abc
abc
401018, 401018, 401018, 401018, 401018
404000, 401000, 401000


printf("%x, %x, %x, %x, %x/n", kkk, &kkk, *kkk, **kkk, ***kkk); 进行反汇编,结果如下:

printf("%x, %x, %x, %x, %x/n", kkk, &kkk, *kkk, **kkk, ***kkk);
4010df: 83 ec 08 sub $0x8,%esp
4010e2: 68 18 10 40 00 push $0x401018
4010e7: 68 18 10 40 00 push $0x401018
4010ec: 68 18 10 40 00 push $0x401018
4010f1: 68 18 10 40 00 push $0x401018
4010f6: 68 18 10 40 00 push $0x401018
4010fb: 68 2d 30 40 00 push $0x40302d
401100: e8 2b 04 00 00 call 401530 <_printf>
401105: 83 c4 20 add $0x20,%esp

以上的问题可以归结如下的问题:

int foo();
int (*pFoo)();

pFoo = foo;
pFoo = &foo;

请注意对pFoo赋值的两种形式,它们是等价的。因为对C编译器而言,函数名本身就代表函数的入口地址,所以第一种形式对C编译器是正确的。但问题是在C的语法层讲,对指针赋值而不取地址是讲不过去的,因些第二种形式也应该被允许。

这时问题出就来了:foo这个函数名倒底是什么?foo == &foo

其结果就是,编译器在处理函数名时,从逻辑上将其做为“指向自己的指针”。由此foo, &foo, *foo, **foo的值就都是一样的了。

至于为什么不允许&&foo,不光是对函数名不允许,在C里你就不可能见到这种语法形式,道理很简单:对变量取址得到变量的地址,对地址取址得到什么?这在概念上是讲不过去的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: