很多人认为 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 到底修饰的是什么了吧? ^_^ 。