1. 高级声明
只有当确实需要的时候,才应该使用多层间接访问。不然的话,程序将会变得更庞大、更缓慢并且更难于维护。
int f; /*一个整型变量*/
int *f; /*一个指向整型的指针*/
第二个声明把表达式*f
声明为一个整数。我们就可以推断出f是个指向整形的指针。
C声明的这个解释方法可以通过下面的方法验证
int* f,g;
只有f才是一个指针,g只是一个普通类型的变量。
int f();
它把f声明为一个函数,它的返回值是一个整数。
int *f();
f是一个函数,它的返回值类型是一个指向整型变量的指针。
int (*f)();
第一对括号只起到聚组的作用,它迫使间接访问在函数调用前进行,使f成为一个函数指针,它的返回值是一个整型值。
程序中的每个函数位于内存中的某个位置,所以存在指向那个位置的指针是完全有可能的。
int *(*f)();
f也是一个函数指针,不过它的返回值是一个指向整型值的的指针,必须对它进行间接访问才能得到一个整型值。
(float (*)())
表示一个"指向返回值为浮点类型的函数的指针"的类型转换符。
int f[];
f是一个数组。
int *f[];
下标优先级更高。f是一个数组,它的元素类型是指向整型的指针。
int f()[]; //错误
f是一个函数,它的返回值是一个整型数组。但是,这个声明是非法的——函数只能返回标量值,不能返回数组。
int f[](); //错误
这个声明也是非法的,因为数组元素必须具有相同的长度,但不同的函数显然可能具有相同的长度。
int (*f[])();
括号内的表达式*f[]
先进行求值,所以f是一个元素位某种类型的指针的数组。表达式末尾的()是函数调用操作符,所以f肯定是一个数组,元素类型为函数指针,它所指向的函数的返回值是一个整型值。
int *(*f[])();
这个声明创建了一个指针数组,指针所指向的类型的返回值为一个整型指针的函数。
ANSI C标准要求我们使用完整的函数原型,是声明更加准确。
int *f(int,float);int *(*g[])(int,float);
前者把f声明为一个函数指针,它所指的函数接受两个参数,分别是一个整型值和一个浮点型值,并返回一个整型值。
后者把g声明为一个数组,数组的元素类型为一个函数指针,它所指向的函数接受两个参数,分别是一个整型值和一个浮点型值,并返回一个整型指针。
1.1 (*(void(*)())0)();
(*(void(*)())0)();
第一步:
假定变量fp是一个函数指针,那么*fp就是该指针所