C语言在声明各种类型的变量,函数等的时候包含一个十分重要的东西,那就是声明器(declarator)-它是所有声明的核心。简单的说,声明器就是标识符以及与它组合在一起的任何指针、函数括号、数组下表等。有些事合法但是有些是非法的:
例如fool()(),或者foo()[]这都是非法的。
但是const int* (*p(int **p))(char *str,float p);这样的都是合法的。
一、结构-structstruct fruit{//各种变量}fruit1,fruit2; //fruit1和fruit2都是同一种类型;在C语言中,struct关键字不能省略;
联合在其他语言中被称为变体记录(variant record)。它的外表与结构体类似,但在内存的布局上有着关键性的区别。在结构中每个成员一次存储,而在联合中,所有的成员都从偏移地址零开始存储。这样,每个成员的位置重叠在一起:某一时刻,只有一个成员真正存储于该地址。
联合一般被用来节省空间,因为有些数据项是不可能同时出现的,如果同时存储他们显的有些浪费空间。就好比要记录一块显示屏上某一时刻的数据信息:出现的数字有可能是int,float,也有可能是字符串,有可能是图片等等;但是某一个时刻就只能显示其中一个,我们也只需要某一时刻的数据,这时候我们就可以用union数据结构,这样不仅能存储所有的数据类型,还节省了大量的空间。
例如下面的程序:union { int num; struct{char a,b,c,d}byte; }value;这样我们可以轻易地取得单独字节字段,如:value.byte.a。不需要额外的空间赋值或者强制类型转换。
enum number{small=5,medium,large=10,humungous};//类似于定义了一堆宏;缺省情况下,整形值从零开始。赋值后,后面的以此+1;
const int* (*p(int **p))(char *str,float p);这个声明看起来不那么友好,那么怎样使其看起来比较简洁呢?这个时候typedef就派上了用场。
typedef const int *(*pFun)(char *str,float p);
那么此时该声明可以简化为:
pFun p(int **p);
我们还可把上述的声明继续复杂化:const int* (*p(int **p,void (*pFun1)(int a)))(char *str,float p);看这个声明,其实也没什么,在复杂也不要怕,一层层的拨开它的真面目,其实真的没什么?
typedef void (*pFunt1)(int ); typedef const int *(*pFunt2)(char *str,float p); 那么上式简化为:pFunt2 p(int **p,pFunt1 );这样一看就十分明了,一个函数带两个参数,就是这么简单,没有什么大不了的地方!
#define INT int unsigned INT a;//OK,这里没有问题; //但是: typedef int INT; unsigned INT a;//ERROR,这是非法的;(2)typedef定义的类型能够保证声明中所有的变量均为同一类型,但是#define不行:
typedef int* INTeger; INTeger a,b;//这里a,b都是int *类型的; //但是: #define INTeger int* INTeger a,b;//这里a是int*,但是b是int类型的;注:typedef应该使用在数组、结构、指针以及函数的组合类型。