《[免费下载 c语言深度解剖[1]》

下载本书

添加书签

[免费下载 c语言深度解剖[1]- 第11节


按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
在实际项目中,为了方便,可能很多数据类型(尤其是结构体之类的自定义数据类型)

需要我们重新取一个适用实际情况的别名。这时候 
typedef就可以帮助我们。例如: 


typedef 
structstudent 


{ 


//code 


}Stu_st;*Stu_pst;//命名规则请参考本章前面部分 


A),structstudent 
stu1;和 
Stu_ststu1;没有区别。 
B),structstudent 
*stu2;和 
Stu_pststu2;和 
Stu_st*stu2;没有区别。
这个地方很多初学者迷惑,B)的两个定义为什么相等呢?其实很好理解。我们把 
“structstudent{ 
/*code*/}”看成一个整体, 
typedef就是给“ 
structstudent{/*code*/}”取了个
别名叫“ 
Stu_st”;同时给“ 
structstudent{ 
/*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这时候到底修饰
的是什么呢?我们在讲解 
constinti的时候说过 
const放在类型名“int”前后都行;而 
constint 


*p与 
int* 
constp则完全不一样。也就是说,我们看 
const修饰谁都时候完全可以将数据类
型名视而不见,当它不存在。反过来再看“constStu_pststu3”,Stu_pst是“structstudent 
{ 
/*code*/} 
*”的别名; 
“structstudent{/*code*/} 
*”是一个整体。对于编译器来说,只认为 
Stu_pst是一个类型名,所以在解析的时候很自然的把“Stu_pst”这个数据类型名忽略掉。
现在知道 
const到底修饰的是什么了吧?^_^。
1。17。3,typedef与#define的区别
噢,上帝!这真要命!别急,要命的还在后面呢。看如下例子: 


E), 
#defineINT32 
int 
unsignedINT32 
i=10; 
F),typedefintint32; 
unsignedint32 
j=10;

其中 
F)编译出错,为什么呢? 
E)不会出错,这很好理解,因为在预编译的时候 
INT32
被替换为 
int,而 
unsigned 
int 
i 
= 
10;语句是正确的。但是,很可惜,用 
typedef取的别
名不支持这种类型扩展。另外,想想 
typedef 
staticintint32行不行?为什么?


下面再看一个与#define宏有关的例子: 


G),#definePCHAR 
char* 
PCHARp3;p4; 
H),typedef 
char*pchar; 
pchar 
p1;p2;

两组代码编译都没有问题,但是,这里的 
p4却不是指针,仅仅是一个 
char类型的字符。
这种错误很容易被忽略,所以用 
#define的时候要慎之又慎。关于#define当然还有很多话题
需要讨论,请看预处理那一章。当然关于 
typedef的讨论也还没有结束,在指针与数组那一
章,我们还要继续讨论。

1。17。4,#define 
aint'10'与 
typedef 
inta'10';
留两个问题: 


1),#definea 
int'10' 
A);a'10' 
a'10'; 
B);a'10' 
a; 
C);int 
a'10'; 
D);int 
a; 
E);a 
b'10'; 
F);a 
b; 
G);a* 
b'10'; 
H);a* 
b; 
2);typedef 
inta'10'; 
A);a'10' 
a'10'; 
B);a'10' 
a; 
C);int 
a'10'; 
D);int 
a; 
E);a 
b'10'; 
F);a 
b; 


G);a* 
b'10'; 
H);a* 
b; 


3),#definea 
int*'10' 
A);a'10' 
a'10'; 

B);a'10' 
a; 


C);int 
a'10'; 
D);int 
a; 
E);a 
b'10'; 
F);a 
b; 
G);a* 
b'10'; 
H);a* 
b; 


4);typedefint* 
a'10'; 
A);a'10' 
a'10'; 


B);a'10' 
C);int 
D);int 
E);a 
F);a 


G);a* 
H);a* 


5),#define 
a; 
a'10'; 
a; 
b'10'; 
b; 


b'10'; 
b; 


*a 
int'10' 


A);a'10' 
a'10'; 
B);a'10' 
a; 


C);int 
a'10'; 
D);int 
a; 
E);a 
b'10'; 
F);a 
b; 
G);a* 
b'10'; 
H);a* 
b; 


6);typedefint 
(* 
a)'10'; 
A);a'10' 
a'10'; 
B);a'10' 
a; 


C);int 
a'10'; 
D);int 
a; 
E);a 
b'10'; 
F);a 
b; 



G);a* 
b'10'; 
H);a* 
b; 


7),#define 
*a 
* 
int'10' 
A);a'10' 
a'10'; 
B);a'10' 
a; 
C);int 
a'10'; 
D);int 
a; 
E);a 
b'10'; 
F);a 
b; 
G);a* 
b'10'; 
H);a* 
b; 
8);typedefint* 
(*a)'10'; 
A);a'10' 
a'10'; 
B);a'10' 
a; 
C);int 
a'10'; 
D);int 
a; 
E);a 
b'10'; 
F);a 
b; 
G);a* 
b'10'; 
H);a* 
b;


请判断这里面哪些定义正确,哪些定义不正确。另外, 
int'10'和 
a'10'到底该怎么用?


第二章符号

符号有什么好说的呢?确实,符号可说的内容要少些,但总还是有些可以唠叨地方。
有一次上课,我问学生:‘/’这个符号在 
C语言里都用在哪些地方?没有一个人能答完整。
这说明 
C语言的基础掌握不牢靠,如果真正掌握了 
C语言,你就能很轻易的回答上来。这
个问题就请读者试着回答一下吧。本章不会像关键字一样一个一个深入讨论,只是将容易
出错的地方讨论一下。

表(2。1)标准 
C语言的基本符号 


符号名称符号名称
,逗号 
》右尖括号 
。圆点 
!感叹号
;分号 
|竖线
:冒号 
/斜杠
?问号 
反斜杠 
’单引号 
~波折号 
“双引号 
#井号 
(左圆括号 
)右圆括号 
'左方括号 
'右方括号 
{左大括号 
}右大括号 
%百分号 
& 
and(与) 
^ 
xor(异或) 
*乘号 
…减号 
=等于号 
小提示:按 回车 [Enter] 键 返回书目,按 ← 键 返回上一页, 按 → 键 进入下一页。 赞一下 添加书签加入书架