C_and_CPP 版 (精华区)

发信人: seaboy (...seaboy), 信区: C_and_CPP
标  题: [FAQ]C/C++里的变量声明/定义彻底分析
发信站: 哈工大紫丁香 (2003年11月14日12:39:37 星期五), 站内信件


C/C++的变量定义应该是初学者最先接触的基本概念之一。是啊,连变量都没定义的程序能
 
干什么?但是,你真的彻底了解变量定义的真实语义么?让我们从最简单的开始。 

int i; 

这个最简单了。定义了一个整型变量。它同时也代表了变量定义的基本形式: 

类型 变量名; 

类型后面接着变量名,就是定义了一个相应类型和名字的变量。但是,除了这类基本形式 
,C语言里还有三种亚类型定义形式: 

int *p, a[10], f(); 

上面就定义了三个变量(符号?),p是一个指向整数类型变量的指针,a是一个有10个整 
数变量的数组,f是一个…不接受任何参数而返回整数的函数声明!在这里,指针/数组/函
 
数都是所修饰的符号的亚类型。之所以叫亚类型,那是因为它们不能离开最前面的主值类 
型而独立存在。其次,在声明变量的时候,主值类型可以为后面的所有变量名共享,而亚 
类型则不行。在一行声明语句中,主值类型是对行而言的,而亚类型只能修饰单个变量。 
这里面有趣的一个地方是,同是亚类型,表示指针的*号是放在变量的前面的,而其他两个
 
则恰好放在变量的后面。这个放置在变量前面的星号常常会引导初学者误解。就是说,如 
果把int *p的形式,改成int* p的形式,好像指针类型就进入了主值类型,变成面向整行 
的了。这是不对的!主值类型只能是单个标识符!换言之,要想把亚类型信息加入某个主 
值类型,必须用typedef来定义。 

另外一个现象是,主值类型和三个亚类型一起对变量类型的作用是相互独立的。因此,它 
们可以组合起来可以表示非常复杂的类型概念。这里唯一的难题,也是初学者容易搞不清 
楚的地方就是,谁先谁后的问题。数组和函数声明比较好办,因为两个都是后置修饰,谁 
先来就解释谁。比如: 

int f[10](), g()[10]; 

在第一个例子里,数组先修饰,所以f是一个数组,其每个元素是一个函数【注】。第二 
个变量函数先修饰,所以g是一个函数,返回值为一个数组。 

如果这两个亚类型分别和指针一起修饰,就有优先级问题了。到底是指针先,还是数组或 
者函数先?这里的答案是,除非括号干涉,后置的优先。比如, 

int *f[10]; // 这是指针数组。请与 int (*f)[10]对比,这是指向数组的指针。 
int *g(); // 这是返回整型指针的函数!int (*g)()就变成函数指针了。 

如果你都掌握了上面的概念,相信变量类型定义再也难不倒你了。 

【注】:实际上只有函数指针的数组,没有函数数组。这里是为了解释概念的组合而折衷
, 
读者须自己体会。 

--
欢迎到C_and_CPP版讨论相关问题。

※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.239.104]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.637毫秒