C语言int * (* (*fp1) (int) ) [10]声明是啥意思呢?

发布时间 2024-01-11 13:08:33作者: 自由小菜园

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个元素的数组,数组的元素是什么呢?

6、往左结合,看到一个* ,说明数组元素是指针,并且指向的是int类型

所以总结,这是一个函数指针,函数返回一个指向含有10个元素的数组指针,并且该数组元素都是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类型