请选择 进入手机版 | 继续访问电脑版

C++编程

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2922|回复: 5

[求助] 请问大家一下,关于C的复杂声明的理解

[复制链接]

6

主题

62

帖子

206

积分

初软

Rank: 3Rank: 3

积分
206
发表于 2017-2-27 17:20:09 | 显示全部楼层 |阅读模式
RT,比如const int * const *** const ** const p;
或者int (*(*func[7][8][9])(int*))[5];
怎么样去读可以方便理解(上面的太极端,只是例子)
还有,关于对这类复杂声明的typedef的使用,我看的书里面关于这个的介绍比较少(我还没有开始看C专家编程,只是在C Programming Language里面遇到了,就来问一下)
回复

使用道具 举报

8

主题

31

帖子

323

积分

版主

Rank: 7Rank: 7Rank: 7

积分
323
QQ
发表于 2017-2-28 10:07:52 | 显示全部楼层
本帖最后由 嬴政 于 2017-2-28 11:21 编辑

const int * const *** const ** const p  这是一个错的,语法出错,所以这种情况是不会存在的 const int必须连着。
int(*(*func[7][8][9])(int*))[5];
这个东西,你可以去拆。从左向右看,会发现和C中的int (*)[5] p;
二维数组指针变量说明的一般形式为:
    类型说明符  (*指针变量名)[长度]
拆解上面的就是
形如 nt(*))[5];,很明显上面有一个指向二维数组的指针,具体是什么,现不用管
接着分析,会发现
*func[7][8][9])(int*)
很像函数指针,确实就是函数的指针,是三维的,函数指针能数是int *
*func[7][8][9])(int*)可以改成 *func[7][8][9])(int*p)
上面与下面结合,就是有7*8*9的函数指针,每个函数指针指向的是函数指针数组(5维)
形如这样的
func[7][8][9]指向的是 typedef int(*(*f)(int *))[5]; 是一个包含多个函数指针的数组

上面的推的过程先验证一下
typedef int(*(*func[7][8][9])(int*))[5];
func  a;
这时调试查看a是不是上面过程中的 三维数组





可以看出,确实是多维数组
居然是数组,那么删除掉func[7][8][9]
结果是
typedef int(*(*)(int*))[5]; 看像不像函数指针
去指 [5] 然后加个变量名看
typedef int(*(*fp)(int*));
再看看
typedef int(*( *fp)(int *ipt))[5];
其中 ( *fp)(int *ipt) 是函数的指针
去掉后就是
typedef int(*)[5];
这不就是多维函数指针么
与多维数组指针
nt(*))[5];

在代码中,定义
fp p = NULL;

这就是一个函数数组指针
现在就差
typedef int(*( *fp)(int *ipt))[5];

  1. #include "stdafx.h"

  2. typedef int(*(*func[7][8][9])(int*))[5];

  3. typedef int(*( *fp)(int *ipt))[5];

  4. int _tmain(int argc, _TCHAR* argv[])
  5. {
  6.         func  a;
  7.         fp p = NULL;
  8.         a[0][0][0] = p;
  9.         return 0;
  10. }
复制代码

typedef int(*( *fp)(int *ipt))[5]; 相关说明,在下面连接,是返回一维数组。
http://blog.chinaunix.net/uid-16875687-id-2155683.html

终于分析出来了,最终代码
  1. typedef int(*(*func[7][8][9])(int*))[5];

  2. typedef int(*(*fp)(int *g))[5];

  3. typedef int(p5)[5];//先定义整体
  4. typedef p5*(*ipt1)(int *); //定义p5的类型


  5. p5 * test(int *)
  6. {
  7.         return NULL;
  8. }
  9. int _tmain(int argc, _TCHAR* argv[])
  10. {
  11.         func  a;
  12.         fp p = NULL;
  13.         ipt1 k1;
  14.         k1 = test;
  15.         p = k1;
  16.         a[0][0][0] = p;
  17.         return 0;
  18. }
复制代码









本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
VC纵横、磐实编程网
回复 支持 反对

使用道具 举报

6

主题

62

帖子

206

积分

初软

Rank: 3Rank: 3

积分
206
 楼主| 发表于 2017-2-28 13:14:30 | 显示全部楼层
本帖最后由 000 于 2017-2-28 13:18 编辑
嬴政 发表于 2017-2-28 10:07
const int * const *** const ** const p  这是一个错的,语法出错,所以这种情况是不会存在的 const int必 ...

关于const int * const *** const ** const p的声明。这个是符合声明规则的,在我的VS上是可以编译并运行的,看了下你的错误可能是没有初始化。
对于const int必须连着可能有异议,应为也存在int *const p这样的声明的,只是const类型限定符不一样一个是普通的类型限定符(const)一个是指针的类型限定符(*const ),如果是有了*const 后面直接跟了标识符的话那么就一定要对其进行初始化因为这样声明的标识符本身内容是不可以被修改的(栈上储存的内容)这个问题我是这样子理解的,不知您有何高见,不妨指出一下!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

6

主题

62

帖子

206

积分

初软

Rank: 3Rank: 3

积分
206
 楼主| 发表于 2017-2-28 13:39:39 | 显示全部楼层
嬴政 发表于 2017-2-28 10:07
const int * const *** const ** const p  这是一个错的,语法出错,所以这种情况是不会存在的 const int必 ...

哦哦,那么譬如:int (*(*(*func)(int *))[5])(int *);
func就是一个返回了一个有5个元素的数组的指针(数组元素是返回int的数组指针)的一个函数指针了?
用typedef声明就是这样子的:对不对?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

6

主题

62

帖子

206

积分

初软

Rank: 3Rank: 3

积分
206
 楼主| 发表于 2017-2-28 13:40:13 | 显示全部楼层
谢谢了!问题太简单,耽误您时间了。
回复 支持 反对

使用道具 举报

8

主题

31

帖子

323

积分

版主

Rank: 7Rank: 7Rank: 7

积分
323
QQ
发表于 2017-2-28 14:16:41 | 显示全部楼层
000 发表于 2017-2-28 13:39
哦哦,那么譬如:int (*(*(*func)(int *))[5])(int *);
func就是一个返回了一个有5个元素的数组的指针(数 ...

int (*(*(*func)(int *))[5])(int *);,
你用VS去做测试,直接声明,一个变量,然后赋一个数值,编译出错后,编译器会为你拆分。
人工分太累了,真不好意思。

学到这种程度,不建议再看C有关语法方面的啦,基本上语法方面的也学得差不多了,花时间去学习数据结构吧。
VC纵横、磐实编程网
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|C++编程  

GMT+8, 2019-7-22 19:39 , Processed in 0.093750 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表