本帖最后由 原野之狼 于 2012-11-7 12:48 编辑
char、unsigned char、int、long等等是基本类型,使用typedef可以定义出扩展的类型,该类型与基本类型本质上是一样的。
而int *p之类,它仅仅是一种写法,意义很明确:
1. int是一个类型。
2. p是变量名。
3. 加*号表明p是指针变量,其指向int类型的变量,再次强调,这仅仅是一种写法,此时在你的逻辑里你应该认为没有int*这种类型(她还没有产生出来)。
正因为如此,以下两条语句意义截然不一样。
int *p1,p2; //p1是指针变量,p2是整形变量。
int *p1,*p2; // p1和p2都是指针变量。
当typedef int *P_INT之后,才扩展出了新的类型,即P_INT类型,我们写几条语句看看:
P_INT p1,p2; // p1和p2都是P_INT类型的变量
P_INT *p1, p2; //p1是指针变量,p2是P_INT类型的变量。
P_INT *p1,*p2; // p1和p2都是指针变量。
再罗嗦一句:以上两条语句加了*号,这仅仅是一种写法
当然还可以接着typedef P_INT *PP_INT,此时又造出了一种新的类型PP_INT,怎么用就不再赘述了。
再补充几点:
1.关于const的简单用法
声明为常量,可以有两种写法:
const int a;
int const a;
其实它们是一样的。
以上两条语句包含3要素:
a) const限定符
b) 类型名int,该类型名可以是基本类型(比如int,char,long...),也可以是typedef扩展的类型。
c) 变量名a
依据b)的说法,我们可以再写几条语句:
const P_INT a;
P_INT const a;
以上两条语句等价,均表示变量a为常量。
备注:以上写法其实是有问题的,因为const变量在定义时就得进行初始化,除非是作为函数参数使用。
2.关于const的复杂用法
那就是把指针添加上。
举例:
const int *p;
int const *p;
int * const p; // 需要在定义时进行初始化
const int * const p; // 需要在定义时进行初始化
int const * const p; // 需要在定义时进行初始化
以上语句包含5要素:
a) 类型名int,该类型名可以是基本类型(比如int,char,long...),也可以是typedef扩展的类型。
b) 变量名p
c) *符号,该符号表明变量p是指针变量,同之前讲的一样,仅仅是一种写法。
d) 用于修饰变量p的const限定符号,表明p是常量。
e) 用于修饰类型int的const限定符号,表明p指向的变量是常量。
有以上1、2两部分知识点,就很容易理解11楼提到的问题了:
INT8U_P是类型,其满足1部分提到的模型。
INT8U*是一种写法,其满足2部分提到的模型。
3. 关于指针
本文或者其它**经常提到指针一词,其根据上下文具有两种不同的意义:
a) 指针变量,作为变量来理解,“指针”是修饰词,表明该变量是一个指针类型的变量。
b) 指针类型,作为类型来理解。c语言包括两种类型,一个是基本类型以及typedef出来的扩展类型,另一个是指针类型。
在编程时,以上两种表达,都可以用sizeof()在编译期求得变量或类型的尺寸,对于32位机器:
a) sizeof(指针变量) == 4
b) sizeof(指针类型) == 4 |