很多人认为
typedef
是定义新的数据类型,这可能与这个关键字有关。本来嘛,
type
是
数据类型的意思;
def(ine)
是定义的意思,合起来就是定义数据类型啦。不过很遗憾,这种
理解是不正确的。也许这个关键字该被替换为“
typerename
”或是别的词。
typedef
的真正意思是给一个已经存在的
数据类型(注意:是类型
不是变量)取一个别
名,而非定义一个新的数据类型。比如:华美绝伦的芍药,就有个别名
---
“将离”。中国古
代男女交往
,
往往以芍药相赠
,
表达惜别之情
,
送芍药就意味着即将分离。所以文人墨客就给芍
药取了个意味深长的别名
-----
“将离”。这个新的名字就表达了那种依依不舍的惜别之情
…
这样新的名字与原来的名字相比,就更能表达出想要表达的意思。
在实际项目中,为了方便,可能很多数据类型(尤其是结构体之类的自定义数据类型)
需要我们重新取一个适用实际情况的别名。这时候
typedef
就可以帮助我们。例如:
typedef struct student
{
//code
}Stu_st,*Stu_pst;//
命名规则请参考本章前面部分
A
),
struct student stu1
;和
Stu_st stu1
;没有区别。
B
),
struct student *stu2
;和
Stu_pst stu2
;和
Stu_st *stu2
;没有区别。
这个地方很多初学者迷惑,
B
)的两个定义为什么相等呢?其实很好理解。我们把
“
struct student { /*code*/}
”看成一个整体,
typedef
就是给“
struct student {/*code*/}”
取了个
别名叫“
Stu_st
”;同时给“
struct student { /*code*/} *”
取了个别名叫“
Stu_pst
”。只不过这两
个名字同时取而已,好比你给你家小狗取了个别名叫“大黄”,同时你妹妹给小狗带了小帽
子,然后给它取了个别名叫“小可爱”。
^_^
。
好,下面再把
typedef
与
const
放在一起看看:
C),const Stu_pst stu3;
D),Stu_pst const stu4;
大多数初学者认为
C
)里
const
修饰的是
stu3
指向的对象;
D
)里
const
修饰的是
stu4
这个指针。很遗憾,
C
)里
const
修饰的并不是
stu3
指向的对象。那
const
这时候到底修饰
的是什么呢?我们在讲解
const int i
的时候说过
const
放在类型名“
int
”前后都行;而
const int
*p
与
int * const p
则完全不一样。也就是说,我们看
const
修饰谁都时候完全可以将数据类
型名视而不见,当它不存在。反过来再看“
const Stu_pst stu3
”,
Stu_pst
是“
struct student
{ /*code*/} *”
的别名
,
“
struct student {/*code*/} *”
是一个整体。对于编译器来说,只认为
Stu_pst
是一个类型名,所以在解析的时候很自然的把“
Stu_pst
”这个数据类型名忽略掉。
现在知道
const
到底修饰的是什么了吧?
^_^
。