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,参数列表为空的函数指针.
个人意见,仅供参考.
我以我的角度来拆解一下,希望对你有些参考作用.
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]的数组指针
以前我给别人的回帖 先看看吧
二级指针,只想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())[])();完成声明。
先理解这几条:
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
你的方法很实用,很感谢!
#8
你的理解没错.
#9
你的七条总结对新手很有用,非常感谢!
#10
这种归约的方式是机器干的,人来干不合适...
人比较适合自顶向下的分析.
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是一个函数,返回指向数组的指针,这个数组里放的是函数指针.
人比较适合自顶向下的分析.
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,参数列表为空的函数指针.
个人意见,仅供参考.
我以我的角度来拆解一下,希望对你有些参考作用.
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]的数组指针
以前我给别人的回帖 先看看吧
二级指针,只想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())[])();完成声明。
先理解这几条:
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
你的方法很实用,很感谢!
#8
你的理解没错.
#9
你的七条总结对新手很有用,非常感谢!
#10
这种归约的方式是机器干的,人来干不合适...
人比较适合自顶向下的分析.
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是一个函数,返回指向数组的指针,这个数组里放的是函数指针.
人比较适合自顶向下的分析.
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 专家编程》关于声明的那一章,对这种问题讲的很清楚,建议你看一下