免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3189 | 回复: 10
打印 上一主题 下一主题

哪位解释一下这个复杂的表达式 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-03-31 23:46 |只看该作者 |倒序浏览
表达式如下:
  1. int* (*(*anyCallback)int *( * )[n])[n]
复制代码


据说是一本叫《C++程序设计陷阱》的书里的,找了一本这书的电子版,结果是加密的。。。-.-
书里对这个表达式的解释是:
  1. 这是一个指向函数的指针,而这个函数用指向数组的指针作为参数,这个数组由指向int的n个指针构成,而且这个函数返回相同类型的指针
复制代码

对int *( * )[n]的解释是
  1. 由指向int的n个指针构成的数组的指针
复制代码


但是,对这解释怎么想怎么一头雾水。。。。

首先,
int (*xxoo)[n]表示一个指向数组的指针
int (*func())[n]则表示一个函数,它的返回值是一个指向数组的指针

那么,
int*(*xxoo)[n]表示一个指向数组的指针的指针?

这样,就有了int *(*func())[n]

那么,int* (*(*anyCallback)int *( * )[n])[n]中的*(*anyCallback)int *( * )[n]该怎么解释呢?难道是*(*anyCallback)(int *( * )[n])的简写?

哪位能给详细解释一下这个表达式?

[ 本帖最后由 Lrj 于 2008-4-1 00:28 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-04-01 00:26 |只看该作者
原帖由 Lrj 于 2008-3-31 23:46 发表
表达式如下:
int* (*(*anyCallback)int *( * )[n])[n];

据说是一本叫《C++程序设计陷阱》的书里的,找了一本这书的电子版,结果是加密的。。。-.-
书里对这个表达式的解释是:
这是一个指向函数的指针, ...


你下面这个语句是不是有点问题?

  1. int* (*(*anyCallback)int *( * )[n])[n];
复制代码

应该为:

  1. int* (*(*anyCallback)(int *( * )[n]))[n];
复制代码

论坛徽章:
0
3 [报告]
发表于 2008-04-01 00:28 |只看该作者
呵呵,我刚编辑了一下贴子,提出了这个问题
这个式子是同学msn给我的,原始表达式我也没见到。。。。
不知道有没有这种省略的方式

[ 本帖最后由 Lrj 于 2008-4-1 00:29 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2008-04-01 00:32 |只看该作者
原帖由 Lrj 于 2008-4-1 00:28 发表
呵呵,我刚编辑了一下贴子,提出了这个问题
这个式子是同学msn给我的,原始表达式我也没见到。。。。
不知道有没有这种省略的方式


应该不是简写。

论坛徽章:
0
5 [报告]
发表于 2008-04-01 00:34 |只看该作者
那可能是我同学抄错了吧,明天去确认一下。。。。
谢谢scutan~

论坛徽章:
0
6 [报告]
发表于 2008-04-01 00:39 |只看该作者

  1. int* (*(*anyCallback)(int *( * )[n]))[n];
复制代码

是一个函数指针的形式,只能作为声明,不能作为定义。
即相当于是void (*p)();
如果需要定义,则应该用下面的形式。
即相当于是void p() {}

  1. int *(*anyCallback(int* (*)[n]))[n];
复制代码


它所表示的意思就是说:
anyCallback是一个函数,它返回的是一个指针,这个指针指向是一个数组,这个数组有n个元素,每个元素都为一个int*类型。
而anyCallback有一个参数,这个参数是一个指针,这个指针是指向一个数组,数组类型为int*,长度为n。

[ 本帖最后由 scutan 于 2008-4-1 01:10 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2008-04-01 01:08 |只看该作者
A simple test


  1. #include<stdio.h>
  2. #include<stdlib.h>

  3. const int n = 10;

  4. int *(*(*any2)(int* (*arg)[n]))[n];

  5. int *(*any(int* (*arg)[n]))[n]
  6. {
  7.         int i;
  8.         int *(*a)[n];

  9.         a = (int* (*)[n])malloc(sizeof(int* (*)[n]) * n);
  10.         if (a == NULL)
  11.         {
  12.                 return NULL;
  13.         }
  14.         for (i = 0; i < n; i++)
  15.         {
  16.                 a[0][i] = (int*)((int)(arg[0][i]) + 10);
  17.         }
  18.         return a;
  19. }

  20. int main()
  21. {
  22.         int i;
  23.         int *(*b)[n];
  24.         int *(*c)[n];

  25.         b = (int* (*)[n])malloc(sizeof(int* (*)[n]) * n);
  26.         if (b == NULL)
  27.         {
  28.                 printf("malloc b error\n");
  29.                 exit(1);
  30.         }
  31.         for (i = 0; i < n; i++)
  32.                 b[0][i] = (int*)(i+1000);

  33.                 any2 = any;

  34.         c = any2(b);
  35.         if (c != NULL)
  36.         {
  37.                 for (i = 0; i < n; i++)
  38.                 {
  39.                         printf("%d,%d\n", (int)b[0][i], (int)c[0][i]);
  40.                 }
  41.         }
  42.         else
  43.                 printf("any error\n");
  44.         return 0;
  45. }

复制代码

论坛徽章:
0
8 [报告]
发表于 2008-04-01 14:57 |只看该作者

回复 #7 scutan 的帖子

程序报错:variably modified ‘any2’ at file scope
另外,上午确认了一下,那本书上就是这样写的:int* (*(*anyCallback)int *( * )[n])[n]
这下就奇怪了。。。。根本不符合语法嘛。。。。难道是从IOCCC里流传出来的。。。-.-

论坛徽章:
0
9 [报告]
发表于 2008-04-01 16:30 |只看该作者
原帖由 Lrj 于 2008-4-1 14:57 发表
程序报错:variably modified ‘any2’ at file scope
另外,上午确认了一下,那本书上就是这样写的:int* (*(*anyCallback)int *( * )[n])[n]
这下就奇怪了。。。。根本不符合语法嘛。。。。难道是从IOCCC里 ...


我是用VC来编译的, 你如果用GCC编译的话将那个
const int n = 10;
改为
#define n 10
就可以了. 也可以直接在linux下用G++编译即可.

论坛徽章:
0
10 [报告]
发表于 2008-04-01 23:57 |只看该作者

回复 #9 scutan 的帖子

嗯,编译通过了,可为什么会有这种区别呢,报错是针对修改any2的啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP