int *( *( *arr[5])())(); 我这样描述对吗?

sweird 2011-08-11 09:39:25

int *( *( *arr[5])())();

arr是个数组,该数组带有五个函数指针,该函数返回一个指向函数指针的指针。


以前刚学C的时候感觉做种题目没意义,但一年的C开发工作下来,再去回顾这些的时候觉得很有意义,对于这种问题自己还是没有十足的把握。
...全文
211 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2011-08-12
  • 打赏
  • 举报
回复
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”

提醒:
“学习用汇编语言写程序”

“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!
AnYidan 2011-08-12
  • 打赏
  • 举报
回复
有很多人这样写程序吗?

能读懂,但我写不出
liutengfeigo 2011-08-11
  • 打赏
  • 举报
回复
有人写了个程序可以直接解析了.
你找找那帖子.
jernymy 2011-08-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 babilife 的回复:]
这样的代码确实令人头疼!

本来想自己层层拨开他的真正面纱

可是无奈,网上有人解释的比我写的要好


C/C++ code



首先确认这是定义的一个数组
T arr[5];

T 是int *( *(*)())(); 得知T是个指针

一个指向 一个 无参函数 返回 int *( *)();

i……
[/Quote]

解释的挺好的

sweird 2011-08-11
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 icemornings 的回复:]
理解这种复杂的声明的方法是:
1、从中间开始,找到变量
2、向右看
3、向左看
4、向右看
……
---------------------
就这样……
[/Quote]

我记得初学时,完全不明白一下左一下右什么概念,抽象。。。现在总算明白了。
icemornings 2011-08-11
  • 打赏
  • 举报
回复
理解这种复杂的声明的方法是:
1、从中间开始,找到变量
2、向右看
3、向左看
4、向右看
……
---------------------
就这样……
sweird 2011-08-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 babilife 的回复:]
这样的代码确实令人头疼!

本来想自己层层拨开他的真正面纱

可是无奈,网上有人解释的比我写的要好


C/C++ code


首先确认这是定义的一个数组
T arr[5];

T 是int *( *(*)())(); 得知T是个指针

一个指向 一个 无参函数 返回 int *( *)();

int……
[/Quote]

对于他的解释,额,看不明白。。。。
不过这个例子挺好。试试。
至善者善之敌 2011-08-11
  • 打赏
  • 举报
回复
这样的代码确实令人头疼!

本来想自己层层拨开他的真正面纱

可是无奈,网上有人解释的比我写的要好



首先确认这是定义的一个数组
T arr[5];

T 是int *( *(*)())(); 得知T是个指针

一个指向 一个 无参函数 返回 int *( *)();

int *( *)();说明一个 指向返回int* 的无参函数指针

所以arr 就是元素个数为5,指向一个返回类型为[返回为int*无参函数指针]的无参函数指针 数组

验证
typedef int *PINT;
typedef PINT (*PFUNC)();
typedef PFUNC (*ARR_ELE_TYPE)();
typedef ARR_ELE_TYPE ARR_TYPE[5];

int fun(ARR_TYPE);
int main()
{
int *( *( *arr[5])())();
sizeof(fun(arr)); //编译通过 OK
}
sweird 2011-08-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 icemornings 的回复:]
arr是一个数组,数组保存的是5个指针,这些指针指向一种函数,这种函数接受任意个参数(C语言中),返回一个指针,这个指针指向一种函数,这种函数接受任意个参数(C语言中),返回一个指针,这个指针指向int型。
----------------------
OK就这样,能看懂就看吧……
[/Quote]

嗯,挺清淅。
icemornings 2011-08-11
  • 打赏
  • 举报
回复
arr是一个数组,数组保存的是5个指针,这些指针指向一种函数,这种函数接受任意个参数(C语言中),返回一个指针,这个指针指向一种函数,这种函数接受任意个参数(C语言中),返回一个指针,这个指针指向int型。
----------------------
OK就这样,能看懂就看吧……

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧