C指针复杂声明
char (*(*x())[])();
char (*(*x[3])())[5];
请描述一下上面的两个指针的含义,如果能写两个实例的话,就更好了。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
char (*(*x())[])();
char (*(*x[3])())[5];
请描述一下上面的两个指针的含义,如果能写两个实例的话,就更好了。
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(5)
对于这种复杂的声明格式,可以采用替换的形式来看明白。
比如
char (*(*x())[])();
这个, 你可以找个 a代替括号里面的,然后逐步代替。所以上面的x是一个函数,参数为空,返回值是一个数组的指针,数组的每一项是一个指针,指向的是一个函数指针,这个函数的形式是空参返回char。
所以使用的方式就是
同样的道理
char (*(*x[3])())[5];
这个表达式的使用方式就是也就是说x 是个有3个值的数组,每个数组的类型是一个函数指针,这个函数(b)是空参,返回的是一个指针,指向一个含有5个char的数组。
1、x是一个函数,这个函数不接受参数,并返回指针,指针指向数组,数组的元素是函数指针,函数指针指向的函数不接受参数,并返回char
2、x是一个数组,数组包含3个函数指针,函数指针指向的函数不接受参数,并返回指针指向包含5个char元素的数组
能写出这种代码的人,对于后期代码维护简直就是个灾难。如果这个人走了
关于C语言声明问题。任何不介绍 http://cdecl.org/ 的答案都是耍流氓。
这原本其实是一个unix程序(或其他系统),被改造成了在线版。
通过这个网站,你可以检查自己的答案是否正确。
建议根据优先级来推论,不建议用替换法,因为替换的元素不同可能会导致优先级与原来的声明不同。
所以我建议参考 bbaimu 的答案。李引证的答案中有一个表达的小错误,他在表达第一题数组元素时
用了两次指针,这是不对的。正确的表述应该是 数组的每一个元素是一个函数指针 。
另外,建议参考书籍《C和指针》中高级指针那章,
还有《C Programming: A Modern Approach》 - K. N. King 关于声明详细介绍那章