| 仔细观察,第一种写法只是第一个*的位置不同,第二种写法少了一个*,但是都能正确编译通过,且正确执行。 
 为什么会有这两种答案呢?查阅资料后发现,与历史原因有关……
 
 先来看看如下例子:
 
 例一:
 
 运行程序后发现#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表达式的值是一个指针!
 
 
 
 既然取不取址都可以,那么*不*也都可以……
 
 所以,在调用一个函数的时候,也有两种方法,正如前面的两种答案。
 
 
 |