C语言int * (* (*fp1) (int) ) [10]声明是啥意思呢?
int a
a一个int类型的变量
int* p
p是一个指针变量,指向int类型对象
const关键字,除非右边是一个类型说明符,那么它作用于该类型说明符,否则作用于左边的符号
const int * p
这里const右边是int类型说明符,所以作用于int,a是一个指针变量,指向const的int类型变量
*p=1这样使用将会报错,因为指向的那个变量是只读的,无法修改
int const * p
这里的const右边是 * 符号,所以const也是作用于左边的int符号,结果同上
int * const p
这里的这里的const右边是p,所以const是作用于左边的*符号
*p=1没问题;p=&a 错误,因为const作用的是*符号,表示该指针变量是只读的,无法修改
再看一些其他的
char ** p1; // p1是指针,指向一个指针x,x指向char
const char **p2; // p2是指针,指向一个指针x,x指向一个const char
char * const * p3; // p3是指针,指向一个const指针x,x指向char
const char * const * p4; // p4是指针,指向一个const指针x,x指向一个const char
char ** const p5; // p5是const指针,指向一个指针x,x指向一个 char
const char ** const p6; // p6是const指针,指向一个指针x,x指向一个const char
char * const * const p7; // p7是一个const指针,指向一个const指针x,x指向一个char
const char * const * const p8; // p8是一个const指针,指向一个const指针x,x指向一个const char
再看些其他简单的声明
int p[3]
p是一个数组,数组的每一个元素是int类型
int*p[3]
p是一个数组,数组的没一个元素是int*指针类型
int(*p)[3]
p是一个指针,指针指向一个int[3]数组,数组的每一个元素是int类型
int (*p)()
p是一个指针,指针指向一个返回int类型的函数
上面这些简单的声明,都比较清楚,基本一眼就能看出来
下面来一个复杂的
int * (* (*fp1) (int) ) [10];
有一个简单的识别规则,从标识符开始,往右边结合,遇到右括号再向左结合,当前括号结束以后,再跳到外层的括号从新开始一轮的结合
1、标识符fp1
2、右边没有其他运算符,只有一个)括号,所以向左结合 遇到一个*,说明这是一个指针,指向哪里呢?
3、再往左只有一个(括号 跳到外面,继续往右 看到一个(int) ,说明这是一个函数,所以结合第2步 这是一个指向函数的指针,函数参数是int类型, 那函数返回什么呢?
4、往右又是一个括号,则往左结合,是一个*号,说明该函数返回的是一个指针,那么返回的指针指向哪里呢?
5、往左遇到(,再跳到外面,往右结合看到 [10],说明这个指针指向一个10个元素的数组,那数组的元素是什么呢?
6、往左结合,看到一个* ,说明数组元素是指针,并且指向的是int类型
所以总结,这是一个函数指针,函数返回一个指向含有10个元素的数组指针,并且该数组元素都是int*类型
再分析一个
char * (* (* f (char *(*para)(char *))) [2])()
f->(char *(*para)(char *)) 说明是一个函数,函数返回什么呢->*->说明返回一个指针,那么指针指向哪里?->[2]说明是一个数组,那数组的每个元素是什么?->*说明是每个元素是指针,那每个指针指向哪里?->()说明指针指向函数,
那么函数返回什么呢?->*说明函数返回了指针,那指针指向什么?->char 说明指针指向char类型数据
char *(*para)(char *) 参数是什么?para->*说明是指针,那指向哪里?->(char *)说明指向的是函数, 那函数返回什么->*函数返回了指针,指针又指向哪里?->char 指向的是char类型数据
int (*(*fun(int*(*p)(int *)))[5]) (int*)
两个变量名,跟上面差不多,里面那个p肯定是函数的参数 int (*(*fun( int*(*p)(int *) ))[5]) (int*)
fun是一个函数,参数是int*(*p)(int *),p是一个函数指针。
fun函数,那么返回是什么?看了下左边是一个*,说明是指针。那指针指向哪里呢?看右边是一个[5],说明是一个数组,那数组的元素是什么呢?看下左边是*
那么数组元素是指针,指针又指向哪里呢?右边是一个(int*),说明是一个函数,再看左边是Int,说明函数返回的是int类型
同样的方法,看下面几个例子
int *( *( *arr[5])())(); 是一个指针数组,每一个指针指向函数,函数返回的也是一个指针,指针指向的又是一个函数,函数又返回的是指针
float ( * ( *b()) [] )(); 是一个函数,该函数返回一个指针,指针指向的是一个数组,数组的每一个元素又是一个指针,指向一个返回float的函数
void * ( *c) ( char, int (*)()); 是一个指针,指针指向一个函数,并返回一个void *指针,函数的参数有2个,一个是char类型,另一个是函数指针(函数返回的是int类型,函数没有参数)
void ** (*d) (int &, char **(*)(char *, char **)); 是一个指针,指针指向一个函数,函数返回的是一个指针,返回的指针指向一个void*指针,函数有2个参数,一个是引用类型int ,
另一个参数是是函数指针,被指的函数,有两个参数,一个是char*, 另一个是char**, 函数返回char**
float ( * ( * e[10]) (int &) ) [5]; 是一个数组,数组的每一个元素是指针,指针指向一个函数,函数参数是int& ,函数返回的是又是一个指针,指针指向数组,数组每一个元素是float类型