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毫秒