关于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里你就不可能见到这种语法形式,道理很简单:对变量取址得到变量的地址,对地址取址得到什么?这在概念上是讲不过去的。
#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里你就不可能见到这种语法形式,道理很简单:对变量取址得到变量的地址,对地址取址得到什么?这在概念上是讲不过去的。
相关文章推荐
- 关于C++中类的成员函数指针相关问题
- 关于C++中函数指针的使用
- 关于C++和Java的引用和指针的问题
- 关于rand()的函数: 请问一个关于C++的问题...
- c/c++使用指针做函数返回值和指针作函数参数问题
- C++关于this指针、静态变量和静态成员函数
- 关于C/C++: 在函数外存取局部变量问题( 精辟 )
- 【C++总结】关于函数返回对象析构的问题
- 【C++】关于带const的指针问题
- 关于C++中的函数返回局部string的问题
- 一劳永逸:关于C/C++中指针、数组与函数复合定义形式的直观解释
- C++中虚函数指针问题
- Self Summary: C++函数返回引用和指针的问题,局部对象与new对象的问题
- 【C++】【学习笔记】【未成功实现】关于指针的函数【very difficult】
- ads中关于函数指针转换的很奇怪的问题
- 关于C/C++中二维数组、指针的引用等若干问题的总结
- C++中的关于指针的问题
- C++中关于指向对象成员函数打指针例子
- C++指针作为函数的参数进行传递时需要注意的一些问题
- C++里关于类的函数问题~