Chinaunix首页 | 论坛 | 博客
  • 博客访问: 414153
  • 博文数量: 51
  • 博客积分: 2030
  • 博客等级: 大尉
  • 技术积分: 1109
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-15 08:11
文章分类

全部博文(51)

文章存档

2022年(1)

2016年(2)

2015年(1)

2014年(2)

2013年(4)

2011年(9)

2010年(2)

2009年(5)

2008年(14)

2007年(11)

我的朋友

分类: C/C++

2009-01-13 09:48:08

关键词:                                          

初学的时候,我们经常听说:typedef就是define。
看看下面的程序:
define INTEGER int

typedef int INTEGER;
乍一看,也对,除了顺序上的差别

再来看看下面的程序
typedef int INT20[20];
这个用define解释就有些牵强了,不过还是可以一定程度上解释的,比如:
INT20 a;
那么,a就是一个大小为20的整型数组,类似于int a[20];

于是,我们就可以认为:typedef就是define了
直到你遇到如下的程序为止:
typedef int (* pFun)();
define理论立刻崩溃了。下面我讲一下理解typedef的正确方法,分为以下几步:
1.确定被声明的类型:遇到typedef时,从左到右进行扫描,找到第一个“陌生”的标志符,这个标志符就应该是语句所声明的类型名称。eg:
typedef int* (* pt)(int* (*pn)(int * p1,int *p2),int * p3);
如果pt是生词(既不是保留字,也不是生命过的类型),那么它就是要声明的类型。其它的名字都是为了阅读方便的占位符,可有可无。也就是说,上面的语句等价为:
typedef int * (*pt)(int * (*)(int *, int *),int *);
2,之后一旦遇到该类型声明的变量,则在该类型的typedef式中用变量代替类型,去掉typedef关键字,所得到的声明式等价与原来的声明。eg:
pt p;
这个声明式,可以经过两步变化为等价的声明式。
首先,回到pt的typedef式:
typedef int * (*pt)(int * (*)(int *, int *),int *);
用p代替pt:
typedef int * (*p)(int * (*)(int *, int *),int *);
然后把typedef去掉,得到:
int * (*p)(int * (*)(int *, int *),int *);
这个语句与 pt p;
意义相同。


如果你基础扎实,应该知道,这是个函数指针的声明,所指向的函数有两个int * 参数,第一个参数的 (*)(int *,int *)的这个部分又是一个指向函数的指针,这个函数返回一个指向函数指针,经过(*)处理后,变成一个变量,再经过int *处理后,又变成一个指向整形变量的指针 int *。第二个参数是int * ,整个函数返回一个int *。

 

个人认识:在对待typedef定义的类型时要把整个定义看做一个整体 如上面的例子
typedef int INT20[20]; 即定义了一个有二十个元素的整型数组的别名,以后就可以用 INT20 来定义有二十个元素的整型数组变量了

几个经典的实例,以供参考

>1:int *(*a[5])(int, char*);
//pFun是我们建的一个类型别名
typedef int *(*pFun)(int, char*);
//使用定义的新类型来声明对象,等价于int* (*a[5])(int, char*);
pFun a[5];

>2:void (*b[10]) (void (*)());
//首先为上面表达式蓝色部分声明一个新类型
typedef void (*pFunParam)();
//整体声明一个新类型
typedef void (*pFun)(pFunParam);
//使用定义的新类型来声明对象,等价于void (*b[10]) (void (*)());
pFun b[10];

>3. doube(*)() (*pa)[9];
//首先为上面表达式蓝色部分声明一个新类型
typedef double(*pFun)();
//整体声明一个新类型
typedef pFun (*pFunParam)[9];
//使用定义的新类型来声明对象,等价于doube(*)() (*pa)[9];
pFunParam pa;

 

阅读(1694) | 评论(1) | 转发(0) |
0

上一篇:图形学,直线生成算法

下一篇:初晨

给主人留下些什么吧!~~

chinaunix网友2009-10-03 14:02:42

hello qqq