请问x是什么??char ( * ( * x ( ) ) [ ] ) ( )

时间:2022-05-05 21:38:11
From:c程序设计语言 page:101
Answer:
x: function returning pointer to array[] of
pointer to function returning char

x是一个返回指针的函数,这个指针指向一个指针数组,而这个指针数组中的指针是指向返回值为char的函数指针,是这个意思么???

如果是这个意思,我也没看懂是怎么划分层次的啊,请大家指教。

11 个解决方案

#1


你的理解没错.
我以我的角度来拆解一下,希望对你有些参考作用.
char ( *(*x())[])()

首先x紧挨着括号,在结合性上括号优先级大于星号,所以首先判定x为一个函数;
那么一个函数有些什么要素呢?
1. 返回值;
2. 参数列表.
由于紧挨着x的括号的是空的,所以很明显,函数的参数列表为空;
那么接下来就要分析函数的返回值类型.由于表达式比较复杂,我采用了我自称为"替代法"(可能贻笑大方,
可确实是我分析这类问题的方法)的方法:
首先将x()替换为FUNC,得:
char ( *(*FUNC)[])()
又由于(*FUNC),所以判定函数的返回值函数指针(或函数指针数组).将(*FUNC)替换为FUNC_P,得:
char ( *FUNC_P[])()
在上面的表达式中,在FUNC_P左边是*,右边是[],由于结合性优先级上[] > *,所以得知FUNC_P是一个数
组,将FUNC_P[]替换为FUNC_P_ARR,得:
char ( *FUNC_P_ARR)()
到此知FUNC_P_ARR是指针数组,那么数组元素的指针类型有是什么呢?从上面表达式已经很明显的知道其类
型为:
指针数组FUNC_P_ARR元素的类型为:返回值为char,参数列表为空的函数指针.
总结起来就是:
x是一个函数,其参数列表为空,返回值为一指针,该指针指向一个函数指针数组,且该指针数组的指针类型为:
返回值为char,参数列表为空的函数指针.

个人意见,仅供参考.

#2


you are right

#3


char **argv
  二级指针,只想char*类型的指针
int (*daytab)[13]
  一个指向包含13个整型元素的数组的指针
int *daytab[13]
  指针数组,数组里每个元素都是int *类型的指针(指向整型的指针)
void *comp()
  comp函数返回值的类型为void *
void (*comp)()
  函数指针,指向一个没有返回类型的函数
char (*(*x())[])()
  指向函数指针的指针数组, x是一个没有参数的函数, 它的返回值是指向一个数组的指针, 而这个数组的元    素是函数指针, 指向的函数没有参数, 且返回char.
char (*(*x[3])())[5]
   x是一个函数指针数组,函数没有参数,返回char (*)[5]的数组指针

以前我给别人的回帖 先看看吧

#4


X就是个函数名

#5


我是按这样的方法写的:
先理解这几条:
1、定义一个指针,格式为:类型 * 标识符;
2、定义一个数组,格式为:类型 * 标识符[];
3、声明一个函数,格式为:类型 标识符(<参数列表>);
4、定义一个指向数组的指针,格式为:类型 (*标识符)[];
5、定义一个元素为指针的数组,格式为:类型 * 标识符[];
6、声明一个返回指针的函数,格式为:类型 * 标识符(<参数列表>);
7、定义一个指向函数的指针,格式为:类型 (*标识符)(<参数列表>);


x是一个返回指针的函数,这个指针指向一个指针数组,而这个指针数组中的指针是指向返回值为char的函数指针

第一步:“x是一个返回指针的函数”,得到char *x();在这里,简单的把x()看作一个标识符,即:得到了一个指针x();

第二步:“这个指针指向一个指针数组”,理解为“定义一个指向数组元素为指针的指针”,拆分为两层意思:“这个指针指向一个数组”和“这个数组的元素为指针”------
a:首先,“这个指针指向一个数组”,即“定义一个指向数组的指针”,把x()看做标识符,结合第4条,得到char (*x())[];(即得到了一个指向数组的指针x()),由于括号不能拆,*x()是一个整体,应把他看做一个标识符,可理解为定义了一个数组*x()[];
b:然后,“这个数组的元素为指针”,即“定义一个元素为指针的数组”,把*x()看作标识符,结合第5条,得到char *(*x())[];

第三步:“这个指针数组中的指针是指向返回值为char的函数指针”,把(*x())[]看作标识符,结合第7条,得到char (*(*x())[])();完成声明。

#6


指针的复杂声明。

#7


引用 1 楼 JiMoKuangXiangQu 的回复:
你的理解没错.
我以我的角度来拆解一下,希望对你有些参考作用.
char ( *(*x())[])()

首先x紧挨着括号,在结合性上括号优先级大于星号,所以首先判定x为一个函数;
那么一个函数有些什么要素呢?
1. 返回值;
2. 参数列表.
由于紧挨着x的括号的是空的,所以很明显,函数的参数列表为空;
那么接下来就要分析函数的返回值类型.由于表达式比……


你的方法很实用,很感谢!

#8


你的理解没错.

#9


引用 5 楼 weiyumingwww 的回复:
我是按这样的方法写的:
先理解这几条:
1、定义一个指针,格式为:类型 * 标识符;
2、定义一个数组,格式为:类型 * 标识符[];
3、声明一个函数,格式为:类型 标识符(<参数列表>);
4、定义一个指向数组的指针,格式为:类型 (*标识符)[];
5、定义一个元素为指针的数组,格式为:类型 * 标识符[];
6、声明一个返回指针的函数,格式为:类型 ……


你的七条总结对新手很有用,非常感谢!

#10


引用 1 楼 JiMoKuangXiangQu 的回复:
你的理解没错.
我以我的角度来拆解一下,希望对你有些参考作用.
char ( *(*x())[])()

首先x紧挨着括号,在结合性上括号优先级大于星号,所以首先判定x为一个函数;
那么一个函数有些什么要素呢?
1. 返回值;
2. 参数列表.
由于紧挨着x的括号的是空的,所以很明显,函数的参数列表为空;
那么接下来就要分析函数的返回值类型.由于表达式比……
这种归约的方式是机器干的,人来干不合适...
人比较适合自顶向下的分析.
1. char ( *(*x())[])() => char (*xxx)(), xxx = (*x())[]
得到
typedef char (*FUNC_PTR)();
FUNC_PTR (*x())[]
2. FUNC_PTR (*x())[] => FUNC_PTR (*xxx)[], xxx = x()
得到
typedef FUNC_PTR (*ARRAY_PTR)[];
ARRAY_PTR x();
很直观的就能看出x是一个函数,返回指向数组的指针,这个数组里放的是函数指针.

#11



x is function returnning pointer to array of pointer to function returnning pointer to char

《c 专家编程》关于声明的那一章,对这种问题讲的很清楚,建议你看一下

#1


你的理解没错.
我以我的角度来拆解一下,希望对你有些参考作用.
char ( *(*x())[])()

首先x紧挨着括号,在结合性上括号优先级大于星号,所以首先判定x为一个函数;
那么一个函数有些什么要素呢?
1. 返回值;
2. 参数列表.
由于紧挨着x的括号的是空的,所以很明显,函数的参数列表为空;
那么接下来就要分析函数的返回值类型.由于表达式比较复杂,我采用了我自称为"替代法"(可能贻笑大方,
可确实是我分析这类问题的方法)的方法:
首先将x()替换为FUNC,得:
char ( *(*FUNC)[])()
又由于(*FUNC),所以判定函数的返回值函数指针(或函数指针数组).将(*FUNC)替换为FUNC_P,得:
char ( *FUNC_P[])()
在上面的表达式中,在FUNC_P左边是*,右边是[],由于结合性优先级上[] > *,所以得知FUNC_P是一个数
组,将FUNC_P[]替换为FUNC_P_ARR,得:
char ( *FUNC_P_ARR)()
到此知FUNC_P_ARR是指针数组,那么数组元素的指针类型有是什么呢?从上面表达式已经很明显的知道其类
型为:
指针数组FUNC_P_ARR元素的类型为:返回值为char,参数列表为空的函数指针.
总结起来就是:
x是一个函数,其参数列表为空,返回值为一指针,该指针指向一个函数指针数组,且该指针数组的指针类型为:
返回值为char,参数列表为空的函数指针.

个人意见,仅供参考.

#2


you are right

#3


char **argv
  二级指针,只想char*类型的指针
int (*daytab)[13]
  一个指向包含13个整型元素的数组的指针
int *daytab[13]
  指针数组,数组里每个元素都是int *类型的指针(指向整型的指针)
void *comp()
  comp函数返回值的类型为void *
void (*comp)()
  函数指针,指向一个没有返回类型的函数
char (*(*x())[])()
  指向函数指针的指针数组, x是一个没有参数的函数, 它的返回值是指向一个数组的指针, 而这个数组的元    素是函数指针, 指向的函数没有参数, 且返回char.
char (*(*x[3])())[5]
   x是一个函数指针数组,函数没有参数,返回char (*)[5]的数组指针

以前我给别人的回帖 先看看吧

#4


X就是个函数名

#5


我是按这样的方法写的:
先理解这几条:
1、定义一个指针,格式为:类型 * 标识符;
2、定义一个数组,格式为:类型 * 标识符[];
3、声明一个函数,格式为:类型 标识符(<参数列表>);
4、定义一个指向数组的指针,格式为:类型 (*标识符)[];
5、定义一个元素为指针的数组,格式为:类型 * 标识符[];
6、声明一个返回指针的函数,格式为:类型 * 标识符(<参数列表>);
7、定义一个指向函数的指针,格式为:类型 (*标识符)(<参数列表>);


x是一个返回指针的函数,这个指针指向一个指针数组,而这个指针数组中的指针是指向返回值为char的函数指针

第一步:“x是一个返回指针的函数”,得到char *x();在这里,简单的把x()看作一个标识符,即:得到了一个指针x();

第二步:“这个指针指向一个指针数组”,理解为“定义一个指向数组元素为指针的指针”,拆分为两层意思:“这个指针指向一个数组”和“这个数组的元素为指针”------
a:首先,“这个指针指向一个数组”,即“定义一个指向数组的指针”,把x()看做标识符,结合第4条,得到char (*x())[];(即得到了一个指向数组的指针x()),由于括号不能拆,*x()是一个整体,应把他看做一个标识符,可理解为定义了一个数组*x()[];
b:然后,“这个数组的元素为指针”,即“定义一个元素为指针的数组”,把*x()看作标识符,结合第5条,得到char *(*x())[];

第三步:“这个指针数组中的指针是指向返回值为char的函数指针”,把(*x())[]看作标识符,结合第7条,得到char (*(*x())[])();完成声明。

#6


指针的复杂声明。

#7


引用 1 楼 JiMoKuangXiangQu 的回复:
你的理解没错.
我以我的角度来拆解一下,希望对你有些参考作用.
char ( *(*x())[])()

首先x紧挨着括号,在结合性上括号优先级大于星号,所以首先判定x为一个函数;
那么一个函数有些什么要素呢?
1. 返回值;
2. 参数列表.
由于紧挨着x的括号的是空的,所以很明显,函数的参数列表为空;
那么接下来就要分析函数的返回值类型.由于表达式比……


你的方法很实用,很感谢!

#8


你的理解没错.

#9


引用 5 楼 weiyumingwww 的回复:
我是按这样的方法写的:
先理解这几条:
1、定义一个指针,格式为:类型 * 标识符;
2、定义一个数组,格式为:类型 * 标识符[];
3、声明一个函数,格式为:类型 标识符(<参数列表>);
4、定义一个指向数组的指针,格式为:类型 (*标识符)[];
5、定义一个元素为指针的数组,格式为:类型 * 标识符[];
6、声明一个返回指针的函数,格式为:类型 ……


你的七条总结对新手很有用,非常感谢!

#10


引用 1 楼 JiMoKuangXiangQu 的回复:
你的理解没错.
我以我的角度来拆解一下,希望对你有些参考作用.
char ( *(*x())[])()

首先x紧挨着括号,在结合性上括号优先级大于星号,所以首先判定x为一个函数;
那么一个函数有些什么要素呢?
1. 返回值;
2. 参数列表.
由于紧挨着x的括号的是空的,所以很明显,函数的参数列表为空;
那么接下来就要分析函数的返回值类型.由于表达式比……
这种归约的方式是机器干的,人来干不合适...
人比较适合自顶向下的分析.
1. char ( *(*x())[])() => char (*xxx)(), xxx = (*x())[]
得到
typedef char (*FUNC_PTR)();
FUNC_PTR (*x())[]
2. FUNC_PTR (*x())[] => FUNC_PTR (*xxx)[], xxx = x()
得到
typedef FUNC_PTR (*ARRAY_PTR)[];
ARRAY_PTR x();
很直观的就能看出x是一个函数,返回指向数组的指针,这个数组里放的是函数指针.

#11



x is function returnning pointer to array of pointer to function returnning pointer to char

《c 专家编程》关于声明的那一章,对这种问题讲的很清楚,建议你看一下