仔细观察,第一种写法只是第一个*的位置不同,第二种写法少了一个*,但是都能正确编译通过,且正确执行。
为什么会有这两种答案呢?查阅资料后发现,与历史原因有关……
先来看看如下例子:
例一:
- #include <stdio.h>
- void func(void)
- {
- printf("hello.\n");
- }
- void main(void)
- {
- printf("func=%d\n", func);
- printf("&func=%d\n", &func);
- }
运行程序后发现
两次打印结果相同!!!
按照&运算符本来的意义,它要求其操作数是一个对象,但函数名不是对象(函数是一个对象),本来&func是非法的,但很久以前有些编译器已经允许这样做,c/c++标准的制定者出于对象的概念已经有所发展的缘故,也承认了&func的合法性。
因此,对于func和&func可以这样理解,func是函数的首地址,它的类型是void (),&func表示一个指向函数void func(void)这个对象的地址,它的类型是void (*)(),因此func和&func所代表的地址值是一样的,但类型不一样。func是一个函数,&func表达式的值是一个指针!
既然取不取址都可以,那么*不*也都可以……
所以,在调用一个函数的时候,也有两种方法,正如前面的两种答案。
|