作者 青鸟
在C++中指针的声明可以变得十分复杂,比如char *(* c[10])(int **p);
和int (*(*(*pfunc)(int *))[5])(int *);
在处理这种复杂的声明的问题的时候,我们可以遵循以下这几个规则,来帮助我们更好的理解变量的声明。
首先应当找到声明的是哪个变量,这个是最重要的
根据结合顺序
() > [] > *
根据这个顺序来依次结合从内到外逐步来分析
先看几个基础的类型
int* f();
f是一个函数,它的返回类型是一个指针,指针类型是int*
int (* f)();
f是一个函数指针,它指向的函数的返回值是int类型,程序中的每个函数都位于内存中的某个位置,所以存在指向那个位置的指针
|
|
上面就是一个函数指针的实例
int* (* f)();
f是一个函数指针,它指向的函数的返回值是指向int类型的指针
int *f[]
f是一个数组,该数组每个元素都是指向int类型的指针
int (*f)[10]
f是一个指针,指向一个int类型的数组,该数组有十个int类型的值
int (*f[])();
是一个数组,数组元素的类型是函数指针,函数的返回值是一个整型值
int *(*f[])();
f是一个数组,数组元素的类型是函数指针,函数的返回值是指向 int 类型的指针
int (*(f)(int))[5];
首先f是一个函数指针,接受一个int*参数,函数的返回值是一个指针,这个指针指向一个具有5个元素的数组,数组的类型是int
复杂的类型
下面给出上面两个复杂的解释
char* (*c[10])(int **p);
c[10]是一个具有10个元素的指针数组,指针指向一个函数,接受一个参数int**,返回类型为char *
int (((*pfunc)(int *))[5])(int *)
首先f是一个函数指针,接受一个int* 参数,函数的返回值是一个指针,这个指针指向一个具有5个元素的指针数组,数组的类型是int*,该数组的每一个元素都是一个指针,此指针指向一个函数,该函数的参数为int * ,返回类型为int
char* (*(**foo [][8])())[];
foo是一个二维的指针数组,指针指向一个函数,函数的返回值是一个指针,指针指向一个指针数组,指针里的每一个元素都是一个指向char类型的指针
参考文献: 分析C语言复杂指针、函数指针及其定义和用法,C语言函数指针详解。